SQLAlchemy:为列的每个不同值选择一行

时间:2012-11-20 06:46:50

标签: sql sqlalchemy

我想为列的每个不同值选择一行。在这里,我想为col1

执行此操作
| ID | COL1 | COL2 |
--------------------
|  1 |    0 |    0 |
|  2 |    0 |    1 |
|  3 |    1 |   11 |
|  4 |    1 |   12 |
|  5 |    1 |   16 |

结果是:

| ID | COL1 | COL2 |
--------------------
|  1 |    0 |    0 |
|  3 |    1 |   11 |

01col1的不同值。我不确定返回哪一行(例如,不需要id的最小值),只要返回不同的列值。

请假设模型名为TestModel并且所有内容都已完全映射。

2 个答案:

答案 0 :(得分:5)

您需要使用子查询。此外,您还必须选择MINMAX功能:

SELECT * FROM TestModel
WHERE ID IN(SELECT MIN(id) 
            FROM TestModel 
            GROUP BY col1)

输出:

| ID | COL1 | COL2 |
--------------------
|  1 |    0 |    0 |
|  3 |    1 |   11 |

See this SQLFiddle


解决方案的SA版本:

subq = (session.query(func.min(TestModel.id).label("min_id")).
        group_by(TestModel.col1)).subquery()

qry = (session.query(TestModel).
       join(subq, and_(TestModel.id == subq.c.min_id)))

答案 1 :(得分:3)

这将为TestModel列的每个不同值返回TestModel.col1个对象,就像SQL中的GROUP BY查询一样。

session.query( TestModel).group_by( TestModel.col1).all()