带分组依据的两行之间的SQL差异

时间:2019-07-19 17:31:33

标签: sql sql-server

表:原始数据

+---------------------+--------+-------+
|        time         | device | value |
+---------------------+--------+-------+
| 2019-07-19 12:50:00 | a      |   400 |
| 2019-07-19 12:50:00 | a      |   900 |
| 2019-07-19 12:50:00 | a      |   450 |
| 2019-07-19 12:50:00 | b      |   300 |
| 2019-07-19 12:50:00 | b      |   250 |
| 2019-07-19 12:39:00 | a      |   200 |
| 2019-07-19 12:39:00 | a      |   125 |
| 2019-07-19 12:45:00 | b      |   165 |
| 2019-07-19 12:30:00 | a      |    40 |
| 2019-07-19 12:30:00 | a      |    35 |
+---------------------+--------+-------+

结果:

+---------------------+--------+--------+------------------------------+
|        time         | device |  value |                              |
+---------------------+--------+--------+------------------------------+
| 2019-07-19 12:50:00 | a      |    700 | see calculation 1 for detail |
| 2019-07-19 12:50:00 | b      |    135 | see calculation 2 for detail |
| 2019-07-19 12:45:00 | b      |    165 | see calculation 3 for detail |
| 2019-07-19 12:39:00 | a      |    160 | see calculation 4 for detail |
| 2019-07-19 12:30:00 | a      |     40 | see calculation 5 for detail |
+---------------------+--------+--------+------------------------------+

计算: 首先按设备和时间分组,然后找到该分组的最大值。然后在组中找到同一设备的上一记录的最大值,然后减去这两个最大值

按结果分组的

第一个记录为12:50:00和'a' 12:50组中“ a”的最大值= 900,“ a”(或列表中的下一个)的上一个记录= 12:39,最大值= 200

so value = 900-200 = 700

结果中按组分组的

2nd 记录为12:50:00和'b' 12:50:00组中'b'的最大值= 300,'b'的上一个记录(或列表中的下一个)= 12:45:00且其最大值= 165

所以值= 300-165 = 135

结果中按组分组的

第3 条记录将为12:45:00和'b' 12:45:00组中'b'的最大值= 165,'b'的上一个记录(或列表中的下一个)=空且其最大值=空(0)

所以value = 165-0 = 165

按结果分组的

4th 记录为12:39:00和'a' 12:39:00组中'a'的最大值= 200,'a'的上一个记录(或列表中的下一个)= 12:30:00且其最大值= 40

所以值= 200-40 = 160

按结果分组的

第5 条记录将是12:30:00和'a' 12:30:00组中“ a”的最大值= 40,“ a”(或列表中的下一个)的上一个记录= null,其最大值= null(0)

所以value = 40-0 = 40

请帮助我进行mssql查询。

1 个答案:

答案 0 :(得分:2)

我认为这是与lag()的聚合:

select time, device, max(value) as max_value,
       (max(value) - lag(max(value)) over (partition by device order by time)) as diff
from rawdata
group by time, device
order by time desc;

Here是db <>小提琴。