5

我想为column 的每个不同值分别选择一行。在这里我想执行它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 |

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

请假设模型已被调用TestModel并且所有内容都已完全映射。

4

3 回答 3

6

您需要为此使用子查询。而且您还必须选择MINMAX发挥作用:

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

输出:

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

看到这个 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)))
于 2012-11-20T07:08:59.590 回答
3

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

session.query( TestModel).group_by( TestModel.col1).all()
于 2012-11-21T11:00:38.553 回答
3

从 SQLAlchemy 1.0 开始,您可以distinct 使用条件调用,它允许您编写

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

在 Postgresql 中,这将转换为DISTINCT ON查询。

这不仅适用于 ORM,而且适用于 SQLAlchemy Core select

于 2015-08-25T08:28:50.737 回答