需要根据某些条件获取数据

时间:2019-05-17 03:39:01

标签: sql

我有一张桌子

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

2 个答案:

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