Выберите из группы по основанию заявления - PullRequest
0 голосов
/ 24 апреля 2020

На основе таблицы, подобной этой, я хочу сгруппировать по PRODID, а затем выбрать строку на основе оператора case. Оператор case заключается в том, что если IND1 = 1, выберите строку, иначе, если IND2 = 1, выберите строку, иначе выберите строку с max DATE. Если несколько показателей в группе - 1, выберите строку с максимальной датой из группы показателей, равной 1.


PRODID   IND1       IND2       DATE
---------------------------------------------------
1          1         0      4/24/2020
1          0         0      1/2/2020
1          1         0      1/1/2020
2          0         1      4/24/2020
2          0         1      1/1/2020
3          0         0      4/24/2020
3          0         0      1/1/2020
4          1         0      2/2/2020
4          0         1      4/24/2020
4          0         1      4/24/2020

PRODID   IND1       IND2       DATE
---------------------------------------------------
1          1         0      4/24/2020
2          0         1      4/24/2020
3          0         0      4/24/2020
4          1         0      2/2/2020

1 Ответ

1 голос
/ 24 апреля 2020

Один метод использует row_number():

select t.*
from (select t.*,
             row_number() over (partition by prodid
                                order by (case when ind1 > 0 then 1 else 2 end),
                                         (case when ind1 = 0 and ind2 > 0 then 1 else 2 end),
                                         date desc
                               ) as seqnum

      from t
     ) t
where seqnum = 1;

Если вам нравится арифметика c, это можно упростить до:

select t.*
from (select t.*,
             row_number() over (partition by prodid
                                order by ind1 desc, ind2 * (1 - ind1) desc, date desc
                               ) as seqnum

      from t
     ) t
where seqnum = 1;

Обратите внимание, что один прием при размещении логики c вместе гарантирует, что первый ряд используется в следующей ситуации:

1       0      0      2020-01-21
1       1      0      2020-01-20
1       1      1      2020-01-19

Вот почему вы не можете использовать order by ind1 desc, ind2 desc, date desc (что довольно заманчиво).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...