我有一张桌子
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
然后,如果在同一日期sub_id出现了不同的记录,那么我需要检查任何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
答案 0 :(得分:0)
如果您的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
答案 1 :(得分:0)
您非常接近:请尝试以下查询:
SELECT id
,sub_id
,DATE
,course
,CASE CONVERT(VARCHAR(100), cur_rnk)
WHEN '1'
THEN 'art'
WHEN '2'
THEN 'sc'
WHEN '3'
THEN 'cmc'
WHEN '4'
THEN 'math'
END AS course
FROM (
SELECT id
,sub_id
,DATE
,course
,MIN(CASE course
WHEN art
THEN 1
WHEN sc
THEN 2
WHEN cmc
THEN 3
ELSE 4
END) AS cur_rnk
FROM test_table
GROUP BY id
,sub_id
,DATE
);