SQL получить одну строку на основе нескольких условий после группировки по - PullRequest
1 голос
/ 17 февраля 2020

Нужна помощь в создании запроса для случая ниже:

Предположим, у меня есть таблица со следующими записями

Name      Date        Time   Category CategoryKey
John      10/20/2012  10:00  Low       2
Sam       10/20/2012  10:00  High      4
Harry     10/20/2012  10:00  Medium    1
Michael   10/20/2012  10:00  Grey      3
Rob       10/22/2013  11:00  Low       2
Marry     10/23/2014  12:00  Low       2
Richard   10/23/2014  12:00  Grey      3
Jack      10/24/2015  1:30   High      4

Тогда Если существует несколько имен для одной и той же даты и времени, тогда принудительно выбирайте только одна запись, основанная на следующих логиках c, и останавливается, когда выполняется любое из следующих условий:

If Category is Medium then take name 
Else If Category is High then take name
Else If Category is Low then take name
Else If Category is Grey then take name

, поэтому конечный результат будет

Name      Date        Time   Category CategoryKey

Harry     10/20/2012  10:00  Medium    1
Rob       10/22/2013  11:00  Low       2
Marry     10/23/2014  12:00  Low       2
Jack      10/24/2015  1:30   High      4

1 Ответ

2 голосов
/ 17 февраля 2020

Самый простой метод: row_number():

select t.*
from (select t.*,
             row_number() over (partition by date, time
                                order by (case category when 'Medium' then 1 when 'High' then 2 when 'Low' then 3 when 'Grey' then 4 else 5 end)
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

Здесь может быть удобно использовать строковые функции:

             row_number() over (partition by date, time
                                order by charindex(category, 'Medium,High,Low,Grey')
                               ) as seqnum

Это работает для вашего случая, но вам нужно немного осторожнее, чтобы все значения были включены, и чтобы ни одно из них не содержало другого значения.

...