表:原始数据
+---------------------+--------+-------+
| 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查询。
答案 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 <>小提琴。