表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发布于 2019-04-30 05:04:48
您似乎希望获得文档当前版本和前一个版本之间的天数,而忽略了第一个版本。
为此,可以使用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;但我发现你的数据错了。我不知道,可能是我弄错了,也可能是你的日期算术搞错了。
发布于 2019-04-30 05:05:22
您可以使用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发布于 2019-04-30 05:32:23
假设您想要两个版本之间的天数,下面是您的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 121https://stackoverflow.com/questions/55910602
复制相似问题