如何选择该组的日期为空或最大日期的行

dk9*_*96m 2 sql sql-server null greatest-n-per-group

我有一个包含多列的表,但我会让它变得简单,只使用三列。

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');
Run Code Online (Sandbox Code Playgroud)

我想要获取的是 sep_dt 为空的行或最大 sep_dt 按 empl_no 字段分组的行。因此,在我的示例中,这将是第一行“IS000001”(我只希望选择返回 empl_id)。假设 Null 是“6/8/2018”,那么我想返回“00418910”。

我已经尝试过,但我知道这是错误的,因为你不能像这样使用 max :

SELECT   empl_id
FROM     TEMPTBL empl
WHERE    empl_no = '112233' AND (
             sep_dt IS NULL OR
             MAX(sep_dt)
         )
Run Code Online (Sandbox Code Playgroud)

我知道它必须包括一个分组或可能是一个连接。所以我想出了这个:

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
Run Code Online (Sandbox Code Playgroud)

这将为我提供包含日期的行,而不是包含空值的行。因此,如果所有 sep_dt 字段都有值,它将起作用,但如果其中一个字段为 NULL,则它将不起作用,因为我想要具有 null 值的行。我想念什么?

Sal*_*n A 5

我认为你可以简单地使用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
Run Code Online (Sandbox Code Playgroud)

db<>fiddle 上的演示