Как выбрать строку с нулевой или максимальной датой для этой группы - PullRequest
1 голос
/ 02 мая 2019

У меня есть таблица с несколькими столбцами, но я облегчу ее и просто использую три.

CREATE TABLE TEMPTBL(
    empl_id     varchar(8),
    empl_no     varchar(6),
    sep_dt      date
);

INSERT INTO TEMPTBL
VALUES
    ('IS000001', '112233', NULL),
    ('00418910', '112233', '1/1/2019');

Я пытаюсь получить строку, в которой sep_dt равен нулю, или строку, в которойс максимальным значением sep_dt, сгруппированным по полю empl_no.Так что в случае моего примера это будет первая строка, «IS000001» (я просто хочу, чтобы выбор возвращал empl_id).Скажем, вместо Null было '8/6/2018', тогда я бы хотел вернуть '00418910'.

Я пытался, но я знаю, что это неправильно, потому что вы не можете использовать max таким образом:

SELECT   empl_id
FROM     TEMPTBL empl
WHERE    empl_no = '112233' AND (
             sep_dt IS NULL OR
             MAX(sep_dt)
         )

Я знаю, что это должно включать группу или, может быть, объединение.Итак, я придумал это:

SELECT   empl_id
FROM     TEMPTBL
INNER JOIN (
             SELECT   empl_no, max(sep_dt) as sep_dt
             FROM     TEMPTBL
             WHERE    empl_no = '112233'
             GROUP BY empl_no
         ) emp ON TEMPTBL.empl_no = emp.empl_no AND TEMPTBL.sep_dt = emp.sep_dt

Это даст мне строку с датой в ней, а не с нулевым значением.Так что это будет работать, если все поля sep_dt имеют значения, но если одно в NULL, это не работает, потому что я хочу строку с нулевым значением.Что я скучаю?

Ответы [ 2 ]

4 голосов
/ 02 мая 2019

Я думаю, вы можете просто использовать ROW_NUMBER со специальным предложением ORDER BY:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (
           PARTITION BY empl_no
           ORDER BY CASE WHEN sep_dt IS NULL THEN 1 ELSE 2 END, sep_dt DESC
    ) AS rn
    FROM t
) AS x
WHERE rn = 1

Демонстрация на дб <> скрипка

0 голосов
/ 02 мая 2019

вы можете попробовать ниже - используйте group by с 2 полями empl_id,empl_no

SELECT empl_id,empl_no, max(sep_dt) as sep_dt
FROM TEMPTBL
group by empl_id,empl_no
...