来自 SELECT SQL 查询的最大值
Maximum values from SELECT SQL Query
我有一个查询 return 的结果格式如下:
User1 TypeA 3
User1 TypeB 29
User1 TypeC 100
User2 TypeA 221
User2 TypeB 31
User2 TypeC 32
User3 TypeA 21
User3 TypeB 1
User3 TypeC 10
....
所以基本上对于数据库中的每个用户,它列出了 3 行,每行对应于 TypeA、TypeB、TypeC。现在我需要 return 对应于每种类型的最大值的用户 ID。因此,例如,从上面的数据我们将获得:
TypeA User2
TypeB User2
TypeC User1
我不确定如何在 SQL 中进行此操作。
执行此操作的典型方法是使用 row_number()
:
with t as (
<your query here>
)
select t.*
from (select t.*,
row_number() over (partition by typecol order by col3 desc) as seqnum
from t
) t
where seqnum = 1;
Postgres 提供了另一种通常更有效的解决方案:
select distinct on (typecol) q.*
from (<your query here>) q
order by typecol, col3 desc;
试试这个
SELECT X.col2,X.col1 FROM
(SELECT col1,col2,col3,row_number() over (partition by col2 order by col3 desc) as seq,
FROM table1)X
WHERE X.seq = 1
我有一个查询 return 的结果格式如下:
User1 TypeA 3
User1 TypeB 29
User1 TypeC 100
User2 TypeA 221
User2 TypeB 31
User2 TypeC 32
User3 TypeA 21
User3 TypeB 1
User3 TypeC 10
....
所以基本上对于数据库中的每个用户,它列出了 3 行,每行对应于 TypeA、TypeB、TypeC。现在我需要 return 对应于每种类型的最大值的用户 ID。因此,例如,从上面的数据我们将获得:
TypeA User2
TypeB User2
TypeC User1
我不确定如何在 SQL 中进行此操作。
执行此操作的典型方法是使用 row_number()
:
with t as (
<your query here>
)
select t.*
from (select t.*,
row_number() over (partition by typecol order by col3 desc) as seqnum
from t
) t
where seqnum = 1;
Postgres 提供了另一种通常更有效的解决方案:
select distinct on (typecol) q.*
from (<your query here>) q
order by typecol, col3 desc;
试试这个
SELECT X.col2,X.col1 FROM
(SELECT col1,col2,col3,row_number() over (partition by col2 order by col3 desc) as seq,
FROM table1)X
WHERE X.seq = 1