SQL Server 2012中同一ID多行VAL值增量计算问询
计算每个ID的VAL值增量(SQL Server 2012)
先把你的原始数据整理成更清晰的表格形式:
| ID | VAL | Time |
|---|---|---|
| 2 | 1 | 2015-05-09 12:54:39 |
| 3 | 10 | 2015-05-09 12:54:39 |
| 2 | 1 | 2015-05-09 12:56:39 |
| 3 | 10 | 2015-05-09 12:56:39 |
| 2 | 5 | 2015-05-09 13:48:30 |
| 3 | 16 | 2015-05-09 13:48:30 |
| 2 | 7 | 2015-05-09 15:01:09 |
| 3 | 20 | 2015-05-09 15:01:09 |
因为你提到VAL值随时间持续递增,且使用的是SQL Server 2012,我们可以直接用**窗口函数LAG()**来实现需求。这个函数能在同一ID分组内,按时间顺序获取上一条记录的VAL值,用当前VAL减去它就能得到增量。
实现SQL语句
SELECT ID, VAL, Time, -- 计算增量:当前VAL减去上一个时间点的VAL,第一条记录无前置值时设为0 VAL - LAG(VAL, 1, 0) OVER (PARTITION BY ID ORDER BY Time) AS VAL_Increment FROM YourTableName; -- 替换成你的实际表名
语句细节解释
PARTITION BY ID:按ID分组,确保我们只在同一个ID的记录范围内查找上一条数据ORDER BY Time:按时间排序,保证获取的是上一个时间点的VAL值,而非随机的历史记录LAG(VAL, 1, 0):第一个参数是要获取的字段,第二个参数是偏移量(1表示上一条),第三个参数是默认值(无前置记录时返回0,你也可以改成NULL)
执行结果示例
运行上述语句后,会得到如下结果:
| ID | VAL | Time | VAL_Increment |
|---|---|---|---|
| 2 | 1 | 2015-05-09 12:54:39 | 0 |
| 2 | 1 | 2015-05-09 12:56:39 | 0 |
| 2 | 5 | 2015-05-09 13:48:30 | 4 |
| 2 | 7 | 2015-05-09 15:01:09 | 2 |
| 3 | 10 | 2015-05-09 12:54:39 | 0 |
| 3 | 10 | 2015-05-09 12:56:39 | 0 |
| 3 | 16 | 2015-05-09 13:48:30 | 6 |
| 3 | 20 | 2015-05-09 15:01:09 | 4 |
如果第一条记录的增量不需要显示0,而是保留NULL,只需把LAG(VAL, 1, 0)改成LAG(VAL, 1)即可。
内容的提问来源于stack exchange,提问作者user3055889
相关产品推荐
相关产品推荐

