我有一张类似于下面的表格:
+-----+-----------+--------+--------+
| key | timestamp | event1 | event2 |
+-----+-----------+--------+--------+
| 123 | 07:06 | 1 | 0 |
| 123 | 07:21 | 1 | 0 |
| 123 | 07:59 | 0 | 1 |
| 123 | 08:02 | 0 | 1 |
| 456 | 14:21 | 1 | 0 |
| 456 | 15:02 | 0 | 1 |
| ... | ... | ... | ... |
+-----+-----------+--------+--------+
我希望为每个键获取一行,其中接下来的两列是event1的最小值和event2的最大值,然后(手指交叉)两次之间的增量。
+-----+--------+--------+-------+
| key | event1 | event2 | delta |
+-----+--------+--------+-------+
| 123 | 07:06 | 08:02 | 00:54 |
| 456 | 14:21 | 15:02 | 00:41 |
| ... | ... | ... | ... |
+-----+--------+--------+-------+
到目前为止,我已尝试使用max
函数,其中event1
= 1但是无论是否使用该键,我都会获得event1
的总体最大值以及每个键值在任何时候都有这个价值。
答案 0 :(得分:0)
将它们放入子选择中就可以实现这一点。
select
e1."key",
Convert(varchar(8),min(e1."timestamp"), 108) as event1,
Convert(varchar(8), max(e2."timestamp"), 108) as event2,
Convert(varchar(8), (max(e2."timestamp") - min(e1."timestamp")), 108) as delta
from
(select "key", "timestamp" from table1 where event1 = 1) e1
inner join (select "key", "timestamp" from table1 where event2 = 1) e2
on e1."key" = e2."key"
group by e1."key"
编辑:
在@ Andrew的小提琴I created my own
的帮助下另外,更改了格式,输出为:
KEY EVENT1 EVENT2 DELTA
123 07:06:00 08:02:00 00:56:00
456 14:21:00 15:02:00 00:41:00
注意:key
和timestamp
是某些平台上的保留字,因此需要引用。我还假设timestamp
是一个日期时间类型,基于您的示例数据。
答案 1 :(得分:0)
或者您可以使用多个CTE,具体取决于您的RDBMS:
SQL Fiddle
with mins as (
select
[key],
min([timestamp]) as event1
from
table1
where
[event1] = 1
group by
[key])
,maxes as
(select
[key],
max([timestamp]) as event2
from
table1
where
[event2] = 1
group by
[key])
select
mins.[key],
mins.event1,
maxes.event2
from
mins
inner join maxes
on mins.[key] = maxes.[key]
计算增量将取决于您实际存储数据的方式。
答案 2 :(得分:0)
尝试此操作(仅对 TimeFromParts(...)和* Right(...)函数使用SQL Server语法进行格式化,并使用标准SQ elswwhere:
select
"key"
,right(cast(event1 as char(8)),5) as event1
,right(cast(event2 as char(8)),5) as event2
,right(timefromparts(0,0,datediff(ss,event1, event2),0,0),5) as delta
from (
select
"key"
,min(case when event1=1 then timestamp else cast('23:59:59' as time) end) as event1
,max(case when event2=1 then timestamp else cast('00:00:00' as time) end) as event2
from table1
group by "key"
) T
;
来自样本数据的收益:
key event1 event2 delta
----------- ------ ------ -----
123 07:06 08:02 00:56
456 14:21 15:02 00:41