更智能的GROUP BY

时间:2016-06-27 17:49:40

标签: sql group-by

考虑像这样的表。 我称之为测试

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

有没有更好的方法来编写没有连接的最后一个查询

2 个答案:

答案 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