我有一个包含多列的表格,但我会让它变得简单,只使用三列。
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 值的行。 我想念什么?
我认为你可以简单地将
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
您可以尝试以下操作 - 将
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
我也有类似的需求。如果我有相同 empl id 的空日期记录以及其他日期记录,我只需要选择空日期记录。
如果同一个 empl id 有两条带有日期的记录并且没有空日期记录,那么我需要获取最大日期。
我怎样才能实现这个目标?