Как сравнить 2 строки из одной таблицы (SQL Server) - PullRequest
0 голосов
/ 29 апреля 2019

Таблица 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

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

Вы можете использовать функцию LAG (), чтобы просмотреть последний созданный_данный, разделенный по имени и упорядоченный в хронологическом порядке.

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
1 голос
/ 30 апреля 2019

Предполагая, что вам нужны дни между двумя версиями, вот ваш 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
1 голос
/ 30 апреля 2019

Похоже, вы хотите получить дни между текущей и предыдущей версией документа, пропуская первую версию.

Вы можете сделать это, используя 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;

db <> fiddle

Но я вижу, что ваши номера отключены,Я не знаю, возможно, я ошибся или вы ошиблись с арифметикой вашей даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...