TSQL计算最旧和最新行之间的差异
Posted
技术标签:
【中文标题】TSQL计算最旧和最新行之间的差异【英文标题】:TSQL Calculate difference between oldest and newest row 【发布时间】:2021-11-27 17:49:38 【问题描述】:我试图显示用户的分数在他们最旧的条目和最近的条目之间发生了多少变化。
给定数据:
Timestamp | Score | User
2021-08-25 10:22:00 | 1300 | A
2021-08-24 09:38:00 | 1451 | A
2021-08-21 21:53:00 | 1381 | B
2021-08-21 17:17:00 | 1129 | B
2021-08-24 14:32:00 | 1278 | A
2021-08-21 13:21:00 | 1401 | B
我想生成如下所示的输出:
User | CurrentScore | Change | Timestamp
A | 1300 | -151 | 2021-08-25 10:22:00
B | 1381 | -19 | 2021-08-21 21:53:00
我可以显示最旧的行和最新的行,但我很难将两者放在一个带有计算列的输出行中。任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:请检查这是否符合您的需求,请下次不要描述表格,而是提供 DDL+DML(创建表格和插入一些示例数据的查询)
DDL+DML : 应该由 OP 提供!
CREATE TABLE QQ(
[Timestamp] DATETIME2,
Score INT,
[User] VARCHAR(10)
)
INSERT QQ([Timestamp],Score,[User]) VALUES
('2021-08-25 10:22:00',1300,'A'),
('2021-08-24 09:38:00',1451,'A'),
('2021-08-21 21:53:00',1381,'B'),
('2021-08-21 17:17:00',1129,'B'),
('2021-08-24 14:32:00',1278,'A'),
('2021-08-21 13:21:00',1401,'B')
GO
解决方案
;With MyCTE as (
SELECT [user], Score,
[Timestamp] = FIRST_VALUE ([Timestamp]) OVER (PARTITION BY [user] ORDER BY [Timestamp] DESC),
FirstScore = FIRST_VALUE (Score) OVER (PARTITION BY [user] ORDER BY [Timestamp]),
CurrentScore = FIRST_VALUE (Score) OVER (PARTITION BY [user] ORDER BY [Timestamp] DESC)
FROM QQ
)
SELECT DISTINCT [user], CurrentScore, Change = CurrentScore - FirstScore, [Timestamp]
FROM MyCTE
GO
结果
【讨论】:
谢谢,下次有SQL问题我记得加DDL+DML。我不知道有关 SQL Server 问题的协议。 不客气:-)
您应该使用ROWS UNBOUNDED PRECEDING
以防时间戳重复。它也更有效以上是关于TSQL计算最旧和最新行之间的差异的主要内容,如果未能解决你的问题,请参考以下文章