我有一张这样的table:
TagName DateTime value
HA_06_ON 2020-07-07 08:52:14 1
HA_06_ON 2020-07-07 09:01:42 0
HA_06_ON 2020-07-07 09:02:17 1
HA_06_ON 2020-07-07 09:32:55 0
HA_06_ON 2020-07-07 09:33:21 1
HA_06_ON 2020-07-07 09:35:02 0
HA_06_ON 2020-07-07 09:35:27 1
HA_06_ON 2020-07-07 09:35:44 0
HA_06_ON 2020-07-07 10:10:32 1
HA_06_ON 2020-07-07 10:10:40 0
我想根据值(value=1==>starttime,value=0==>endtime)将这个表转换成这个基表。
TagName StartTime EndTime
HA_06_ON 2020-07-07 08:52:14 2020-07-07 09:01:42
HA_06_ON 2020-07-07 09:02:17 2020-07-07 09:32:55
....
我曾尝试在select语句上使用case when,但像这样在每一列上返回null
TagName StartTime EndTime
HA_06_ON 2020-07-07 08:57:07 NULL
HA_06_ON NULL 2020-07-07 09:01:42
HA_06_ON 2020-07-07 09:02:17 NULL
HA_06_ON NULL 2020-07-07 09:32:55
HA_06_ON 2020-07-07 09:33:21 NULL
HA_06_ON NULL 2020-07-07 09:35:02
3条答案
按热度按时间35g0bw711#
就因为我没看到
sum() over
选项例子
退货
6ovsh4lw2#
因为这里没有分组列,所以我们必须做一个假设:我们可以处理您的数据,假设如果按日期排序,1和0将交替。否则就没有解决方案,因为我们不知道如何关联1和0。
既然我们可以假设这个顺序,我们可以使用
lag()
或者lead()
做这个。注意,这假设您从1开始,并且每个1都有一个对应的0。如果最后一个1没有对应的0,则该行的endtime将为空。sbtkgmzw3#
有多种方法可以解决这个问题。如果我假设值是完全交错的,一种方法是聚合: