考虑像这样的表。 我称之为测试
Id A B C D
1 1 1 8 25
2 1 2 5 35
3 1 3 2 75
4 2 2 2 45
5 3 2 5 26
现在我希望行的最大'Id'分组为'A'
Id A B C D
3 1 3 2 75
4 2 2 2 45
5 3 2 5 26
-
--Work, but I do not want
SELECT MAX(Id), A FROM Test GROUP BY A
--I want but do not work
SELECT MAX(Id), A, B, C, D FROM Test GROUP BY A
--Work but I do not want
SELECT MAX(Id), A, B, C, D FROM Test GROUP BY A, B, C, D
--Work and I want
SELECT old.Id, old.A, new.B, new.C, new.D
FROM(
SELECT
MAX(Id) AS Id, A
FROM
Test GROUP BY A
)old
JOIN Test new
ON old.Id = new.Id
有没有更好的方法来编写没有连接的最后一个查询
答案 0 :(得分:3)
大多数数据库都支持window functions
:
select *
from (
select *, row_number() over (partition by a order by id desc) rn
from test
) t
where rn = 1
答案 1 :(得分:1)
大多数DBMS现在支持公用表表达式(CTE)。你可以使用一个。
;with maxa as (
select row_number() over(partition by a order by id desc) rn,
id,a,b,c,d from test
)
select id,a,b,c,d
from maxa
where rn=1