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

Jes*_*ose 5 sql sqlalchemy

我想为列的每个不同值选择一行.在这里,我想执行它col1:

| ID | COL1 | COL2 |
--------------------
|  1 |    0 |    0 |
|  2 |    0 |    1 |
|  3 |    1 |   11 |
|  4 |    1 |   12 |
|  5 |    1 |   16 |
Run Code Online (Sandbox Code Playgroud)

结果如下:

| ID | COL1 | COL2 |
--------------------
|  1 |    0 |    0 |
|  3 |    1 |   11 |
Run Code Online (Sandbox Code Playgroud)

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

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

him*_*056 5

您需要使用子查询.而且你必须选择MINMAX运作:

SELECT * FROM TestModel
WHERE ID IN(SELECT MIN(id) 
            FROM TestModel 
            GROUP BY col1)
Run Code Online (Sandbox Code Playgroud)

输出:

| ID | COL1 | COL2 |
--------------------
|  1 |    0 |    0 |
|  3 |    1 |   11 |
Run Code Online (Sandbox Code Playgroud)

看到这个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)))
Run Code Online (Sandbox Code Playgroud)

  • 简单:您的(通过SA生成的SQL)代码将无法与所有RDBMS系统一起使用.例如,它不会在MSSQL上运行.SA的一个好处是您的产品(可能是)与RDBMS无关.我个人非常重视这一点.但是如果你使用`MySQL`,`sqlite`,`Oracle`或其他`GROUP BY`并不严格的RDBMS,那么你的代码是完美的.我不确定ANSI SQL兼容性. (2认同)

Jes*_*ose 3

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

session.query( TestModel).group_by( TestModel.col1).all()
Run Code Online (Sandbox Code Playgroud)