我有一个带有多个列的表,但是我会简化,只使用三个。
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(。说零是" 6/8/2018",然后我想返回'00418910'。
我已经尝试过,但是我知道这是错误的,因为您不能使用那样的最大值:
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中,它不起作用,因为我想要带有空值的行。我想念什么?
我认为您可以将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
您可以在下面尝试 - 使用2个字段empl_id,empl_no
group by
SELECT empl_id,empl_no, max(sep_dt) as sep_dt
FROM TEMPTBL
group by empl_id,empl_no