首页 > 解决方案 > 需要根据某些条件获取数据

问题描述

我有一张像

id sub_id  course date
1  2           art        01-jan-2019
1  2           sc        01-jan-2019
1  2           cmc     01-jan-2019
1  2          math     01-jan-2019
1  2           sc        02-jan-2019
1  2           cmc     02-jan-2019
1  3          math     01-jan-2019
1  3           art        01-jan-2019
2  2           sc         01-jan-2019
2  2           art        01-jan-2019
2  2           sc         01-jan-2019

然后我需要检查任何 id,如果 sub_id 在同一日期存在不同的记录,则应优先考虑艺术,然后是 sc,然后是 cmc,最后是数学。所以根据逻辑我应该得到数据:

id sub_id  course    date
1  2        art      01-jan-2019
1  2        sc       02-jan-2019
1  3        art      01-jan-2019
2  2        art      01-jan-2019

我试图为数据赋予优先级编号,但之后我无法应用逻辑

select id,sub_id,date,course,case course when art then 1
when sc then 2 when cmc then 3 else 4 end as cur_rnk from test_table;

所以根据逻辑我应该得到数据:

id sub_id  course    date
1  2        art      01-jan-2019
1  2        sc       02-jan-2019
1  3        art      01-jan-2019
2  2        art      01-jan-2019

标签: sql

解决方案


如果您的 dbms 支持,那么您可以尝试使用row_number()

select * from
(
select id,sub_id,date,course,
    row_number() over(partition by id, sub_id,date order by case course when art then 1
when sc then 2 when cmc then 3 else 4 end) as rn
from test_table
)A where rn=1

推荐阅读