我遇到了问题,看起来这应该是一个非常简单的查询。对于每个唯一的名称,我只想返回年龄最低的用户的名称
下面是一个基本示例: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);