如何编写单个SQL查询以使用几个有关特征序列数的条件选出一个子组

时间:2018-06-30 07:34:30

标签: sql sql-server

我有这张桌子:

enter image description here

我需要获取此表:

enter image description here

一个类应对应一个id。该类的选择如下:1)选择最常见的id类(例如,id 222对应于类C)。 2)如果类的数量相等(如ID 111),则选择最后一个日期的类(例如,对于ID 111,类A和B发生3次,但键入B是因为它是该ID的最后日期)。

提前谢谢!

3 个答案:

答案 0 :(得分:2)

您也可以只使用一个分组子查询来完成此操作:

SELECT id, 
(SELECT TOP 1 t2.class FROM tbl t2
  WHERE t2.id=t1.id GROUP BY t2.class 
  ORDER BY COUNT(t2.class) DESC, 
           MAX(t2.date1) DESC) class
FROM tbl t1 GROUP BY id

答案 1 :(得分:1)

使用ROW_NUMBER进行排名,然后在排名为1时进行过滤。

;WITH IdRankings AS
(
    SELECT
        T.Id,
        T.Class,
        Ranking = ROW_NUMBER() OVER (PARTITION BY T.ID ORDER BY COUNT(1) DESC, MAX(T.date1) DESC)
    FROM
        YourTable AS T
    GROUP BY
        T.Id,
        T.Class
)
SELECT
    I.Id,
    I.Class
FROM
    IdRankings AS I
WHERE
    I.Ranking = 1

答案 2 :(得分:1)

如果愿意,您可以执行此操作而没有子查询

select top (1) with ties t.id, t.class
from t
group by t.id, t.class
order by row_number() over (partition by t.id order by count(*) desc, max(t.date) desc);