如何在python SQLAlchemy(sqlite)中的group_by语句中从组中选择特定的行



我遇到了问题,看起来这应该是一个非常简单的查询。对于每个唯一的名称,我只想返回年龄最低的用户的名称

下面是一个基本示例:http://sqlfiddle.com/#!9/ce2f7e4/16

样本数据库:

+-----+-------+-----+
| id  | name  | age |
+-----+-------+-----+
|  1  | joe   |  50 |
|  2  | joe   |  25 |
|  3  | fred  |  25 |
|  4  | fred  |  50 |
|  5  | bob   |  30 |
+-----+-------+-----+

这是当前尝试我正在尝试:

session.query(User).group_by(User.name).order_by(User.name,User.age).all()

在原始SQL中:

SELECT t.id,t.name,t.age from user t
GROUP BY t.name
ORDER BY t.name, t.age;

然而,正如您在示例中看到的那样,这会返回错误的结果。根据需要,我为每个名称获得一行,但所选的用户并不是每个唯一名称的年龄最低的用户。

所需结果:

+-----+-------+-----+
| id  | name  | age |
+-----+-------+-----+
|  2  | joe   |  25 |
|  3  | fred  |  25 |
|  5  | bob   |  30 |
+-----+-------+-----+

正如您所看到的,对于每个唯一的名称,返回的行应该是年龄最低的具有该名称的用户。如何编写sqlalchemy查询以获得此结果?感谢

我不知道如何将其转换为sqlachemy,但在直接的SQL中,您可以使用类似row_number():的排名窗口函数

WITH ranked(id, name, age, rn) AS
(SELECT id, name, age, row_number() OVER (PARTITION BY name ORDER BY age) AS rn
FROM test)
SELECT id, name, age
FROM ranked
WHERE rn = 1
ORDER BY name, age;

DB<gt;Fiddle演示

或者Sqlite特定的:

SELECT id, name, min(age) AS age
FROM test
GROUP BY name
ORDER BY name, age;

如果您想要最年轻的一行,可以使用:

select t.*
from t
where t.age = (select min(t2.age) from t t2 where t2.name = t.name);

最新更新