我需要為每個客戶檢索 MAX ResponsibleEndDate。如果為 NULL,則將其視為 MAX 日期。
CREATE TABLE example
(Id INT, ClientId INT, ClientName VARCHAR(100), ResponsibleId INT, ResponsibleName VARCHAR(100), ResponsibleStartDate DATE, ResponsibleEndDate DATE);
INSERT INTO example
VALUES
(1, 123, 'John Smith', NULL, NULL, NULL, NULL),
(2, 234, 'Thomas Anderson', 12345, 'Tom Cruise', '2019-04-13', '2020-09-15'),
(3, 234, 'Thomas Anderson', 23456, 'John Travolta', '2020-09-16', '2022-01-15'),
(4, 234, 'Thomas Anderson', 37890, 'Van Damm', '2022-01-16', NULL),
(5, 345, 'Mary Tron', NULL, NULL, NULL, NULL),
(6, 456, 'Jackie Chan', 56789, 'Leo Messi', '2018-05-18', '2022-01-18'),
(7, 567, 'Cristiano Ronaldo', 12345, 'Tom Cruise', '2019-05-28', '2021-08-20'),
(8, 567, 'Cristiano Ronaldo', 37890, 'Van Damm', '2021-07-15', '2022-01-15'),
(9, 567, 'Cristiano Ronaldo', 17956, 'Harry Potter', '2022-01-25', NULL)
我需要的輸出:
| ID | 客戶 ID | 客戶名稱 | 責任人ID | 負責人姓名 | 責任開始日期 | 責任結束日期 | 最大日期 |
|---|---|---|---|---|---|---|---|
| 1 | 123 | 約翰·史密斯 | 空值 | 空值 | 空值 | 空值 | 空值 |
| 2 | 234 | 托馬斯·安德森 | 12345 | 湯姆·克魯斯 | 2019-04-13 | 2020-09-15 | 空值 |
| 3 | 234 | 托馬斯·安德森 | 23456 | 約翰特拉沃爾塔 | 2020-09-16 | 2022-01-15 | 空值 |
| 4 | 234 | 托馬斯·安德森 | 37890 | 范達姆 | 2022-01-16 | 空值 | 空值 |
| 5 | 345 | 瑪麗特隆 | 空值 | 空值 | 空值 | 空值 | 空值 |
| 6 | 456 | 成龍 | 56789 | 里奧·梅西 | 2018-05-18 | 2022-01-18 | 2022-01-18 |
| 7 | 567 | 克里斯蒂亞諾·羅納爾多 | 12345 | 湯姆·克魯斯 | 2019-05-28 | 2021-08-20 | 空值 |
| 8 | 567 | 克里斯蒂亞諾·羅納爾多 | 37890 | 范達姆 | 2021-07-15 | 2022-01-15 | 空值 |
| 9 | 567 | 克里斯蒂亞諾·羅納爾多 | 17956 | 哈利波特 | 2022-01-25 | 空值 | 空值 |
我的查詢:
SELECT *,
MAX(ResponsibleEndDate)OVER(PARTITION BY ClientId) AS MAX_END_DATE
FROM example
ORDER BY ClientId, ResponsibleStartDate

uj5u.com熱心網友回復:
在 T-SQL 中,聚合函式忽略NULL值并且NULL也被視為具有最低值,而不是最高值。
因此,您需要使用幾個函式將 替換為NULL任意高的值,然后NULL再次替換:
SELECT ClientID,
ClientName,
{Rest of your columns},
NULLIF(MAX(ISNULL(ResponsibleEndDate,'99991231')) OVER (PARTITION BY ClientId),'99991231') AS MAX_END_DATE
FROM dbo.example
ORDER BY ClientId,
ResponsibleStartDate;
uj5u.com熱心網友回復:
另一種選擇是顯式檢查是否存在NULL
SELECT
ClientID,
ClientName,
{Rest of your columns},
CASE WHEN COUNT(CASE WHEN ResponsibleEndDate IS NULL THEN 1 END) OVER (PARTITION BY ClientId) = 0
THEN MAX(ResponsibleEndDate) OVER (PARTITION BY ClientId)
END AS MAX_END_DATE
FROM dbo.example
ORDER BY
ClientId,
ResponsibleStartDate;
輕微的變化是CASE WHEN COUNT(ResponsibleEndDate) = COUNT(*)因為COUNT只會計算非空值
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429421.html
