TSQL 计算最旧行和最新行之间的差异
TSQL Calculate difference between oldest and newest row
我正在尝试显示用户的分数在他们最早和最近的条目之间发生了多少变化。
给出的数据:
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
我可以显示最旧的行和最新的行,但我很难将这两行放在一个带有计算列的输出行中。感谢任何帮助。
请检查这是否符合您的需要,下次请不要描述 table 提供 DDL+DML(查询以创建 table 并插入一些示例数据)
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
结果
我正在尝试显示用户的分数在他们最早和最近的条目之间发生了多少变化。
给出的数据:
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
我可以显示最旧的行和最新的行,但我很难将这两行放在一个带有计算列的输出行中。感谢任何帮助。
请检查这是否符合您的需要,下次请不要描述 table 提供 DDL+DML(查询以创建 table 并插入一些示例数据)
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