As far as I know, the QgsExpression class allows you to select features from a layer that match a WHERE clause, i.e., the expression is a conditional that returns True or False (or unknown) for each feature. If the expression evaluates to True for a particular feature, that feature is selected in the map.
What I see from your PostGIS SQL expression is that you want a couple of columns from 20 ordered features. There is no WHERE clause. You could run this kind of expressions from the
DBManager->SQL Window instead, which can give you subtables that you could eventually load into QGIS as new layers.
Now, answering your real question, you can use a Python variable to build your expression in this way:
expr = QgsExpression( "\"%s\" = 99" % colName )
print expr.expression() # this should print: "myColumn" = 99