我正在嘗試為每個人回傳具有最大日期的行,我該如何過濾它
- 姓名首字母、日期、文本
- DD, 1/1/2022, 123
- DD,2021 年 1 月 1 日,456
- DD,2020 年 1 月 1 日,789
- 韓國電信,2020 年 1 月 1 日,美國廣播公司
- 韓國電信,2022 年 1 月 1 日,定義
- 韓國電信,2021 年 1 月 2 日,ghi
所以結果是這樣的?
- 姓名首字母、日期、文本
- DD, 1/1/2022, 123
- 韓國電信,2022 年 1 月 1 日,定義
我已經嘗試了 MAX 日期并按首字母分組,但我試圖從具有最大日期的條目中回傳文本。
謝謝
uj5u.com熱心網友回復:
有幾種方法可以做到。
DDL(我使用臨時表進行測驗):
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
DROP TABLE #tmp;
CREATE TABLE #tmp (
initials varchar(10),
date date,
text varchar(10)
);
INSERT INTO #tmp
VALUES
('DD', '2022-01-01', '123'),
('DD', '2021-01-01', '456'),
('DD', '2020-01-01', '789'),
('KT', '2020-01-01', 'abc'),
('KT', '2022-01-01', '123'),
('KT', '2021-01-02', 'ghi');
版本 1(帶有 的子查詢MAX):此版本提取唯一的首字母及其 MAX 日期,然后鏈接回這些首字母和日期的原始表以從記錄中提取文本。
SELECT t.initials, t.date, t.text
FROM #tmp AS t
INNER JOIN (
SELECT initials, MAX(date) AS max_date
FROM #tmp
GROUP BY initials
) AS sub
ON t.initials = sub.initials
AND t.date = sub.max_date
版本 2(帶有 的子查詢ROW_NUMBER):此版本使用視窗函式 ROW_NUMBER 對按日期降序排列的每一行進行編號。這將使最近日期的行號為 1。然后從行號 = 1 的記錄中提取文本。
SELECT sub.initials, sub.date, sub.text
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY initials ORDER BY date DESC) AS row_num
FROM #tmp
) AS sub
WHERE sub.row_num = 1
由于最大日期樣本集中兩個首字母的文本相同,我在最終結果集中添加了首字母和日期以進行澄清。
您也可以使用 CTE 而不是子查詢,這是我更喜歡的,但我不想讓事情復雜化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340102.html
標籤:sql-server
