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计算最旧和最新行之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中按组中的行计算时间差异

计算两个不相邻行之间的差异

计算数据框中所有行与特定行之间的差异

计算 Oracle SQL 中 2 个日期/时间之间的差异

在 SQL 中计算不同日期之间 sum() 的差异

SQL查询计算当前和前一天的值之间的差异