【问题标题】:SQL: Group By on Consecutive Records Part 2SQL:按连续记录分组,第 2 部分
【发布时间】:2015-04-05 07:57:28
【问题描述】:

问题 1

我有下表显示一个人每隔 1 小时的位置

Id EntityID EntityName LocationID Timex delta 1 1 米奇俱乐部 0300 1 2 1 米奇俱乐部 0400 1 3 1 米奇公园 0500 2 4 1 米奇米妮精品店 0600 3 5 1 米奇米妮精品店 0700 3 6 1 米奇俱乐部 0800 4 7 1 米奇俱乐部 0900 4 8 1 米奇公园 1000 5 9 1 米奇俱乐部 1100 6

每次位置更改时,增量都会增加 +1。 我想按照下面的示例返回按增量分组的聚合。

实体名称 LocationID 开始时间 结束时间 米奇俱乐部 0300 0500 米奇公园 0500 0600 米奇米妮精品店 0600 0800 米奇俱乐部 0800 1000 米奇公园 1000 1100 米奇俱乐部 1100 1200

我正在使用从此处获取并改编的以下查询 SQL: Group By on Consecutive Records (效果很好):

select 
    min(timex) as start_date
    ,end_date
    ,entityid
    ,entityname
    ,locationid
    ,delta
from 
    (
    select 
        s1.timex
        ,(  
         select 
            max(timex)
         from 
            [locationreport2] s2
         where 
            s2.entityid = s1.entityid
            and s2.delta = s1.delta
            and not exists 
                (
                select 
                    null
                from 
                    [dbo].[locationreport2] s3
                where 
                    s3.timex < s2.timex
                    and s3.timex > s1.timex
                    and s3.entityid <> s1.entityid
                    and s3.entityname <> s1.entityname
                    and s3.delta <> s1.delta
                )
            ) as end_date
     , s1.entityid
     , s1.entityname
     , s1.locationid
     , s1.delta
from 
    [dbo].[locationreport2] s1
) Result

group by 
    end_date
    , entityid
    , entityname
    , locationid
    , delta
order by 
    1 asc

但是我不想使用增量(计算和填充它需要努力);相反,我想知道是否有任何方法可以在运行查询时将其计算为部分/。

我也不介意使用视图。

问题 2

我有下表,它以 1 小时的间隔显示不同人的位置

Id EntityID EntityName LocationID Timex Delta 1 1 米奇俱乐部 0900 1 2 1 米奇俱乐部 1000 1 3 1 米奇公园 1100 2 4 2 唐纳德会所 0900 1 5 2 唐纳德公园 1000 2 6 2 唐纳德公园 1100 2 7 3 高飞公园 0900 1 8 3 高飞会所 1000 2 9 3 高飞公园 1100 3

我想返回按人员和位置分组的聚合。 例如

EntityID EntityName LocationID StartTime EndTime 1 米奇俱乐部 0900 1100 1 米奇公园 1100 1200 2 唐纳德会所 0900 1000 2 唐纳德公园 1000 1200 3 高飞公园 0900 1000 3 高飞会所 1000 1100 3 高飞公园 1100 1200

我需要对上述查询进行哪些修改(问题 1)?

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?

标签: sql sql-server grouping


【解决方案1】:

听起来像是分析函数的案例。您需要将 1 小时添加到 EndTime,但这取决于数据类型。

SELECT EntityName, LocationID, StartTime, EndTime
  FROM ( SELECT EntityName, LocationID
           ,MIN(Timex) OVER (PARTITION BY EntityID, delta ORDER BY delta) AS StartTime
           ,MAX(Timex) OVER (PARTITION BY EntityID, delta ORDER BY delta) AS EndTime
       FROM locationreport2
    ) x
  GROUP BY EntityName, LocationID, StartTime, EndTime
  ORDER BY EntityName, StartTime

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 2020-05-23
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多