簡體   English   中英

如何比較同一表中的2行(SQL Server)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM