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

时间:2019-05-02 13:39:11

标签: 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');

我要获取的是sep_dt为null的行或具有由empl_no字段分组的最大sep_dt的行。因此,在我的示例中,将是第一行“ 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)
         )

我知道它必须包含一个分组或加入一个分组。所以我想出了这个:

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 个答案:

答案 0 :(得分:4)

我认为您可以简单地将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

Demo on db<>fiddle

答案 1 :(得分:0)

您可以在下面尝试-将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