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

问题描述 投票:0回答:3

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

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 是“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,则它将不起作用,因为我想要具有 null 值的行。 我想念什么?

sql sql-server null greatest-n-per-group
3个回答
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

db<>fiddle 上的演示


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

0
投票

我也有类似的需求。如果我有相同 empl id 的空日期记录以及其他日期记录,我只需要选择空日期记录。

如果同一个 empl id 有两条带有日期的记录并且没有空日期记录,那么我需要获取最大日期。

我怎样才能实现这个目标?

© www.soinside.com 2019 - 2024. All rights reserved.