[英]How to compare 2 rows from same table (SQL Server)
表Doc
數據是這樣的:
id | name | created_dt | version
-----------------------------------------
1 doc1 2018-12-26 1
2 doc2 2018-12-26 A
3 doc1 2019-01-26 2
4 doc1 2019-02-20 3
5 doc2 2019-02-16 B
6 doc3 2019-03-20 1
5 doc2 2019-04-26 C
有什么好的方法可以實現此輸出?
name | version | days
---------------------------------
doc1 2 30
doc1 3 21
doc2 B 60
doc2 C 45
如下查詢
select name, version, datediff(dd, a.created_dt, b.created_dt)
from doc a
inner join doc b on a.name = b.name and a.id > b.id
您似乎希望忽略當前版本和以前版本之間的間隔。
您可以使用lag()
獲取每個文檔的上一版本的日期,並使用datediff()
計算以天為單位的差額。 使用row_number()
可以為每個文檔編號,並過濾出第一個。
SELECT name,
version,
days
FROM (SELECT name,
version,
datediff(day,
lag(created_dt) OVER (PARTITION BY name
ORDER BY version),
created_dt) days,
row_number() OVER (PARTITION BY name
ORDER BY version) rn
FROM elbat) x
WHERE rn <> 1
ORDER BY name,
version;
但是我看到你的電話不多了。 我不知道,我可能弄錯了,或者您在日期算術上出錯了。
您可以使用LAG()函數回顧按名稱划分並按時間順序排列的最后一個created_dt。
DECLARE @doc TABLE(id INT, name NVARCHAR(50),created_dt DATETIME,version NVARCHAR(50))
INSERT @doc VALUES
(1,'doc1','12/26/2018','1'),
(2,'doc2','12/26/2018','A'),
(3,'doc1','01/26/2019','2'),
(4,'doc1','02/20/2019','3'),
(5,'doc2','02/16/2019','B'),
(6,'doc3','03/20/2019','1'),
(5,'doc2','04/26/2019','C')
SELECT
name,
version,
days = DATEDIFF(DAY,PreviousDate,created_dt)
FROM
(
SELECT
name,
version,
created_dt,
PreviousDate = LAG(created_dt) OVER (PARTITION BY name ORDER BY created_dt)
FROM
@doc
)AS X
WHERE
NOT PreviousDate IS NULL
假設您需要兩個版本之間的間隔天,這是您的SQL,其中一行與相同名稱但較早版本進行比較:
DECLARE @MyTable TABLE (id INT, name VARCHAR(10), created_dt DATE, version VARCHAR(10))
INSERT INTO @MyTable
(Id, name, created_dt, version)
VALUES
(1, 'doc1', '2018-12-26', '1'),
(2, 'doc2', '2018-12-26', 'A'),
(3, 'doc1', '2019-01-26', '2'),
(4, 'doc1', '2019-02-20', '3'),
(5, 'doc2', '2019-02-16', 'B'),
(6, 'doc3', '2019-03-20', '1'),
(5, 'doc2', '2019-04-26', 'C')
SELECT * FROM @MyTable ORDER BY name
SELECT T1.name, T1.version, T1.created_dt CreatedT1, T2.created_dt CreatedT2, DATEDIFF(DAY, T2.created_dt, T1.created_dt) diff FROM @MyTable T1
CROSS APPLY (SELECT TOP 1 * FROM @MyTable Tmp WHERE Tmp.name = T1.name AND Tmp.created_dt < T1.created_dt ORDER BY Tmp.created_dt) T2
ORDER BY T1.id
結果(幾天)我變得有些不同:
name version CreatedT1 CreatedT2 diff
doc1 2 2019-01-26 2018-12-26 31
doc1 3 2019-02-20 2018-12-26 56
doc2 B 2019-02-16 2018-12-26 52
doc2 C 2019-04-26 2018-12-26 121
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.