dk9*_*96m 2 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');
Run Code Online (Sandbox Code Playgroud)
我想要获取的是 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)
)
Run Code Online (Sandbox Code Playgroud)
我知道它必须包括一个分组或可能是一个连接。所以我想出了这个:
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
Run Code Online (Sandbox Code Playgroud)
这将为我提供包含日期的行,而不是包含空值的行。因此,如果所有 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1704 次 |
| 最近记录: |