Сгруппировать по DATETIME диапазоны по другой таблице - PullRequest
0 голосов
/ 06 мая 2019

У меня есть таблица с двумя столбцами startdatetime и stopdatetime.

STARTDATETIME             |         STOPDATETIME          |      ID
2019-05-05T05:00:00Z              2019-05-05T06:00:00Z            1
2019-05-05T07:00:00Z              2019-05-05T08:00:00Z            1
2019-05-05T05:00:00Z              2019-05-05T06:00:00Z            2
2019-05-05T07:00:00Z              2019-05-05T08:00:00Z            2
2019-05-05T08:00:00Z              2019-05-05T10:00:00Z            2

Во второй таблице есть столбец с eventdatetime.

EVENTDATETIME           |        ID         |       Event
 2019-05-05T05:30:00Z             1                   1
 2019-05-05T05:45:00Z             1                   1
 2019-05-05T07:30:00Z             1                   1
 2019-05-05T07:30:00Z             2                   1
 2019-05-05T07:40:00Z             2                   1
 2019-05-05T07:50:00Z             2                   1

Я пытаюсь сделать выбор вк первой таблице и присоединитесь ко второй таблице, где время события попадает между строкой, и получите сумму событий.Чего я не знаю, как сделать, так это создать динамическую группу, в которой он будет учитывать другой параметр.

Ожидаемый результат:

 STARTDATETIME             |         STOPDATETIME          |      ID    | SUM(EVENT)
2019-05-05T05:00:00Z              2019-05-05T06:00:00Z            1        2
2019-05-05T07:00:00Z              2019-05-05T08:00:00Z            1        1
2019-05-05T05:00:00Z              2019-05-05T06:00:00Z            2        0
2019-05-05T07:00:00Z              2019-05-05T08:00:00Z            2        3
2019-05-05T08:00:00Z              2019-05-05T10:00:00Z            2        0

Ответы [ 2 ]

1 голос
/ 06 мая 2019
SELECT 
      r.ID
      ,r.STARTDATETIME
      ,r.STOPDATETIME
      ,Sum(e.EVENT) as [SUM(Event)]
  FROM dbo.GroupDatetimeRanges as r
  Left Join dbo.GroupDatetimeEvents as e
  on r.ID = e.ID and e.EVENTDATETIME between r.STARTDATETIME and r.STOPDATETIME
  Group By 
        r.ID
      ,r.STARTDATETIME
      ,r.STOPDATETIME

Результаты

ID  STARTDATETIME           STOPDATETIME           SUM(Event)
1   2019-05-05T05:00:00Z    2019-05-05T06:00:00Z    2
1   2019-05-05T07:00:00Z    2019-05-05T08:00:00Z    1
2   2019-05-05T05:00:00Z    2019-05-05T06:00:00Z    NULL
2   2019-05-05T07:00:00Z    2019-05-05T08:00:00Z    3
2   2019-05-05T08:00:00Z    2019-05-05T10:00:00Z    NULL
0 голосов
/ 06 мая 2019

Попробуйте этот код:

select
      f.StartDateTime
    , f.StopDateTime
    , f.ID
    , Qty = sum(
      case 
        when s.EventDatetime between f.StartDateTime and f.StopDateTime
        then s.Event 
        else 0 
      end)
from FirstTable f
left join SecondTable s on (s.ID = f.ID)
group by f.StartDateTime, f.StopDateTime, f.ID
...