用于对时间序列数据进行分类的SQL查询

时间:2018-03-14 01:29:25

标签: sql sql-server

我有一张看起来像这样的表:

ID   ScheduledPickUpTime   PickUpTime    ScheduledDropTime   DropTime
--  --------------------   ----------    -----------------   --------

1       00:10                 00:30         03:10             03:30
2       01:10                 02:10         03:05             03:10
3       02:30                 02:45         05:20             07:00
4       08:00                 08:45         13:00             14:00
5       11:20                 12:00         20:00             21:00

我需要以下面的格式显示信息,时间跨度从上午12点到下午12点,每次字段列都按时间跨度计算。

TimeData               00:00-01:00   01:00-02:00  02:00-03:00  03:00-04:00  ....

ScheduledPickUpTime     1            1            1             0
PickUpTime              1            0            2             0
ScheduledDropTime       0            0            0             2
DropTime                0            0            0             2

我需要帮助创建执行此操作的sql查询。提前谢谢。

  

更新

该表有一个额外的EventType列。此列需要不显示,每个EventType的计数基于PickUpTime列

ID   ScheduledPickUpTime   PickUpTime    ScheduledDropTime   DropTime   EventType
--  --------------------   ----------    -----------------   --------

1       00:10                 00:30         03:10             03:30     Call
2       01:10                 02:10         03:05             03:10     Email
3       02:30                 02:45         05:20             07:00     Email  
4       08:00                 08:45         13:00             14:00     Call    
5       11:20                 12:00         20:00             21:00     Routine

这种情况下的输出应为

TimeData               00:00-01:00   01:00-02:00  02:00-03:00  03:00-04:00  ....

ScheduledPickUpTime     1            1            1             0
PickUpTime              1            0            2             0
ScheduledDropTime       0            0            0             2
DropTime                0            0            0             2
Call                    1            0            0             0
Email                   0            0            2             0
Routine                 0            0            0             0

EventType列中的值是动态的,可以有更多这样的变化。

有可能实现这一目标吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这很复杂。它是一个支点和一个非透视:

select TimeData,
       sum(case when t >= '00:00' and t < '01:00' then 1 else 0 end) as [00:00-01:00],
       sum(case when t >= '01:00' and t < '02:00' then 1 else 0 end) as [01:00-02:00],
       sum(case when t >= '02:00' and t < '03:00' then 1 else 0 end) as [02:00-03:00],
       . . .
from t apply
     (values ('ScheduledPickUpTime', ScheduledPickUpTime, 1),
             ('PickUpTime', PickUpTime, 2),
             ('ScheduledDropTime', ScheduledDropTime, 3),
             ('DropTime', DropTime, 4)
     ) v(TimeData, t, ordering)
group by TimeData, ordering
order by ordering;
相关问题