繁体   English   中英

从SQL Server结果中选择多个行组

[英]Select multiple groups of row from SQL Server result

我不确定如何为该问题加上标题,但我已尽力而为。.对于使用SQL Server 2016的某些查询,我遇到了一个小挑战。

我的表有很多行,所有行都有一个时间戳列。 基于列Lane_0的值(值0或1),我需要从日期时间列获取时间戳。

该表如下所示:

在此处输入图片说明

行的组标记为黄色。

基本上,该表用于跟踪何时打开或关闭某些内容。 1 =开,0 =关。 我需要找到每个组关闭(值0)时所花费的时间,以及该组的最旧和最新时间​​戳。 群组是Lane_0中0的行的集合。

从图片中,我必须获取Row_num 7、8和9,然后从第7行的时间戳中减去第9行的date_time以获得持续时间。 最后,我需要在第7和9行中选择date_time。

结果应如下所示:

在此处输入图片说明

最后一张图片显示带有三个黄色标记的第一组。 我需要一个可以从表1中选择所有有效组的视图或SQL查询。

这是连续分组的标准技巧:

DECLARE @t TABLE
    (
      rn INT ,
      dt DATETIME ,
      ln INT
    )
INSERT  INTO @t
VALUES  ( 5, GETDATE(), 1 ),
        ( 6, GETDATE(), 1 ),
        ( 7, GETDATE(), 0 ),
        ( 8, GETDATE(), 0 ),
        ( 9, DATEADD(ss, 15, GETDATE()), 0 ),
        ( 10, GETDATE(), 1 ),
        ( 11, GETDATE(), 1 ),
        ( 12, GETDATE(), 0 ),
        ( 13, DATEADD(ss, 6, GETDATE()), 0 ),
        ( 14, GETDATE(), 1 );


WITH    cte
          AS ( SELECT   * ,
                        ROW_NUMBER() OVER ( ORDER BY rn )
                        - ROW_NUMBER() OVER ( ORDER BY ln, rn ) r
               FROM     @t
             )
    SELECT  MIN(dt) ,
            MAX(dt) ,
            DATEDIFF(ss, MIN(dt), MAX(dt))
    FROM    cte
    WHERE   ln = 0
    GROUP BY r

输出:

2017-01-09 15:47:31.560     2017-01-09 15:47:46.560    15
2017-01-09 15:47:31.560     2017-01-09 15:47:37.560    6

您需要在数据中标识“岛屿”。 一种方法使用不同的行号:

select lane_no, min(datetime), max(datetime), count(*),
       datediff(second, min(datetime), max(datetime)) as dur_second,
       datediff(second, min(datetime), max(datetime))/60.0 as dur_minute
from (select t.*,
             row_number() over (partition by lane_no order by date_time) as seqnum_l,
             row_number() over (order by date_time) as seqnum
      from t
     ) t
where lane_no = 0
group by lane_no, (seqnum - seqnum_l);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM