我想为列的每个不同值选择一行。在这里,我想为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 |
0
和1
是col1
的不同值。我不确定返回哪一行(例如,不需要id的最小值),只要返回不同的列值。
请假设模型名为TestModel
并且所有内容都已完全映射。
答案 0 :(得分:5)
您需要使用子查询。此外,您还必须选择MIN
或MAX
功能:
SELECT * FROM TestModel
WHERE ID IN(SELECT MIN(id)
FROM TestModel
GROUP BY col1)
输出:
| ID | COL1 | COL2 |
--------------------
| 1 | 0 | 0 |
| 3 | 1 | 11 |
解决方案的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()