Добавить недостающие таймфреймы в запрос на выборку (sql сервер) - PullRequest
0 голосов
/ 13 апреля 2020

Я использую код (внизу) для извлечения меток времени и некоторых других данных с сервера sql за указанный день, чтобы сделать диаграмму, просто.

запрос объединяет значения времени в 5-минутные диапазоны, так что, например, все записи 12: 00-12: 05 станут одним результатом и покажут максимальные значения для соответствующих столбцов для этого периода времени.

Проблема, которую я Это означает, что если данные отсутствуют, я хочу, чтобы запрос возвращался с пустыми строками для пропущенных 5-минутных диапазонов. По сути, без этих пробелов мне нужно запустить тонну формул массива в Excel, что делает это вместо нескольких минут. секунда.

, таким образом, общий пример будет таким:

DateTime    Parts_Made  Alarm_Light
2020-06-01 12:03    5   0
2020-06-01 12:07    6   0
2020-06-01 12:23    8   0


Would return

DateTime    Parts_Made  Alarm_Light
2020-06-01 12:05    5   0
2020-06-01 12:10    6   0      
2020-06-01 12:15    6   0    <-- inserted "missing" row could also be 12:10 - 0 -0 or 12:10  null null I can work around whatever we can come up with
2020-06-01 12:20    6   0    <-- "another" missing row
2020-06-01 12:25    8   0

Моя первоначальная мысль состояла в том, чтобы просто создать таблицу с каждым возможным 5-минутным интервалом времени в дне и объединить ее с результатом для создать пустые строки, где данных не было, но я не мог понять, как заставить их работать в vba / excel.

Код запроса:

 selectCmd.ActiveConnection = adoDbConn
   selectCmd.CommandText = "SELECT DATEADD(MINUTE, (DATEDIFF(MINUTE, '20000101', DateTime) / 5)*5, '20000101') as Date_Time " & _
    " ,max(Part_Count)-min(Part_Count) as PartsMade" & _
    ", max(Alarm_Light) as Alarmlight" & _
    ", max(PV_Alarm) as Alarm" & _
    " FROM [SMP].[dbo].[33_TestImport] " & _
    " Where [DateTime]>= DateAdd(Hour, DateDiff(Hour, 0, '" & DateYMD & "')-0, 0) AND [DateTime]<= DateAdd(Hour, DateDiff(Hour, 0, '" & DateYMD & "')+24, 0) " & _
    " AND Machine_Number = " & Machvar & " " & _
    " Group BY DATEADD(MINUTE, (DATEDIFF(MINUTE, '20000101', DateTime) / 5)*5, '20000101') "

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете использовать рекурсивный CTE для построения таймфреймов, а затем left join и group by:

with times as (
      select convert(datetime, 2020-06-01 12:05) as dt, 1 as lev
      union all
      select dateadd(minute, 5, dt), lev + 1
      from times
      where lev < 5
     )
select dt.dt,
       max(t.Part_Count)-min(Part_Count) as PartsMade,
       max(t.Alarm_Light) as Alarmlight,
       max(t.PV_Alarm) as Alarm
from times t left join
     [SMP].[dbo].[33_TestImport] ti
     on ti.datetime >= t.dt and
        ti.datetime < dateadd(minute, 5, t.dt) and
        ti.machine = ?
group by t.dt
order by t.dt;

Если ожидается более 100 раз, добавьте option (maxrecursion 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...