我有一个包含多列的表,但我将使其变得简单,只需使用三列即可。
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,则它将不起作用,因为我想要具有空值的行。我想念什么?
答案 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
答案 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