具有最大值的SQL列,其中单独的列= 1

时间:2014-07-21 18:22:33

标签: sql max

我有一张类似于下面的表格:

+-----+-----------+--------+--------+
| 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的总体最大值以及每个键值在任何时候都有这个价值。

3 个答案:

答案 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

注意:keytimestamp是某些平台上的保留字,因此需要引用。我还假设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