我有一個包含名稱和日期列的表。我想獲得當前名稱出現的最早日期。例如:
| 姓名 | 日期 |
|---|---|
| X | 2021 年 1 月 30 日 |
| X | 2021 年 1 月 29 日 |
| X | 2021 年 1 月 28 日 |
| 是 | 2021 年 1 月 27 日 |
| 是 | 2021 年 1 月 26 日 |
| 是 | 2021 年 1 月 25 日 |
| 是 | 2021 年 1 月 24 日 |
| X | 2021 年 1 月 23 日 |
| X | 2021 年 1 月 22 日 |
現在,當我嘗試獲取當前名稱 (X) 開始出現的最早日期時,我想要 28-Jan,但是 sql 查詢會給出 22-Jan-2021,因為那是 X 最初出現的時間。
更新:這是我使用的查詢:
Select min(Date) from myTable where Name='X'
我使用的是較舊的 SQL Server 2008(在升級程序中),因此無法訪問 LEAD/LAG 功能。下面建議的解決方案按預期作業。謝謝。
uj5u.com熱心網友回復:
這是一個缺口和孤島問題。根據示例資料,這將起作用:
WITH Groups AS(
SELECT YT.[Name],
YT.[Date],
ROW_NUMBER() OVER (ORDER BY YT.Date DESC) -
ROW_NUMBER() OVER (PARTITION BY YT.[Name] ORDER BY Date DESC) AS Grp
FROM dbo.YourTable YT),
FirstGroup AS(
SELECT TOP (1) WITH TIES
G.[Name],
G.[Date]
FROM Groups G
WHERE [Name] = 'X'
ORDER BY Grp ASC)
SELECT MIN(FG.[Date]) AS Mi
資料庫<>小提琴
uj5u.com熱心網友回復:
這是一種間隙和島嶼問題。
有很多解決方案。這是針對您的情況進行優化的一種
- 使用
LEAD/LAG識別每個分組中的第一行 - 過濾到僅那些行
- 給它們行編號并取第一個
WITH StartPoints AS (
SELECT *,
IsStart = CASE WHEN Name <> LEAD(Name, 1, '') OVER (ORDER BY Date DESC) THEN 1 END
FROM YourTable
),
Numbered AS (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Date DESC)
FROM StartPoints
WHERE IsStart = 1 AND Name = 'X'
)
SELECT
Name, Date
FROM Numbered
WHERE rn = 1;
資料庫<>小提琴
對于 SQL Server 2008 或更早版本(我強烈建議您升級),您可以使用帶有行編號的自聯接來模擬LEAD/LAG
WITH RowNumbered AS (
SELECT *,
AllRn = ROW_NUMBER() OVER (ORDER BY Date ASC)
FROM YourTable
),
StartPoints AS (
SELECT r1.*,
IsStart = CASE WHEN r1.Name <> ISNULL(r2.Name, '') THEN 1 END
FROM RowNumbered r1
LEFT JOIN RowNumbered r2 ON r2.AllRn = r1.AllRn - 1
),
Numbered AS (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Date DESC)
FROM StartPoints
WHERE IsStart = 1
)
SELECT
Name, Date
FROM Numbered
WHERE rn = 1;
uj5u.com熱心網友回復:
如果我確實理解,您想知道 X 何時消失并再次出現。在這種情況下,您可以按組搜索日期間隔。
這和示例如何檢測
SELECT name
,DATE
FROM (
SELECT *
,DATEDIFF(day, lead(DATE) OVER (
PARTITION BY name ORDER BY DATE DESC
), DATE) DIF
FROM YourTable
) a
WHERE DIF > 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340103.html
