一个类应该对应一个id。该课程选择如下:
如果要从子集中选择任何一行,则应按条件对每行进行RANK
,以对子集中的行进行排序,然后按排名过滤行。
您可以针对您的问题尝试此查询。
select id, class
from (
Select
Id
, Class
, RANK() OVER (PARTITION BY Id
ORDER BY
case when class='other' then 0 else 1 end desc -- condition # 3
, count(*) desc -- condition # 1
, max(date1) desc ) AS RowRank -- condition # 2
from @table1
group by id, class
) Q
where rowrank = 1
如果您的DBMS能够使用row_number()
,您可以先按id
和class
分组以获得计数和最大date1
。从该结果中选择构建由id
分区的行号。作为行号的顺序使用CASE
在任何其他类之后对other
进行排序,然后,降序,计数和最大date1
- 如果计数相等,则最大date1
将决定。仅选择行号等于1的行,即顺序中的第一行。
SELECT id,
class
FROM (SELECT id,
class,
row_number() OVER (PARTITION BY id
ORDER BY CASE class
WHEN 'other'
THEN 1
ELSE
0
END ASC,
c DESC,
d DESC) rn
FROM (SELECT id,
class,
count(*) c,
max(date1) d
FROM elbat
GROUP BY id,
class) x) y
WHERE rn = 1;