Группировка/агрегация SQL заканчивается в 1-часовые блоки

Просто запустите приведенные ниже сценарии на консоли:

sudo npm i -g n
sudo n stable
sudo npm update -g npm

Это будет работать только для Linux и MAC

10
задан Community 23 May 2017 в 10:28
поделиться

3 ответа

У вас должна быть предварительно заполненная таблица (или функция, возвращающая набор результатов таблицы), к которой вы хотите присоединиться, которая содержит все 1-часовые интервалы, которые вы хотите получить в вашем результате.

Затем вы выполняете OUTER JOIN с этим, и вы должны получить их все.

Примерно так:

SELECT SLOT_HOUR, SUM(order_id)
FROM
    ONEHOURSLOTS
    LEFT JOIN ORDERS ON DATEPART(hh, order_date) = SLOT_HOUR
GROUP BY SLOT_HOUR
7
ответ дан 3 December 2019 в 20:43
поделиться

В некоторых из предыдущих ответов рекомендуется использовать таблицу часов и заполнять ее с помощью запроса UNION; это можно сделать лучше с помощью общего табличного выражения:

; WITH [Hours] ([Hour]) AS
(
SELECT TOP 24 ROW_NUMBER() OVER (ORDER BY [object_id]) AS [Hour]
FROM sys.objects
ORDER BY [object_id]
)
SELECT h.[Hour], o.[Sum]
FROM [Hours] h
LEFT OUTER JOIN (
   SELECT datepart(hh, order_date) as [Hour], SUM(order_id) as [Sum]
      FROM Orders
      GROUP BY datepart(hh, order_date) 
) o
ON h.[Hour] = o.[Hour]
9
ответ дан 3 December 2019 в 20:43
поделиться

Создайте таблицу часов, сохраняемую или даже синтезируемую «на лету»:

SELECT h.hour, s.sum
FROM (
   SELECT 1 as hour
   UNION ALL SELECT 2
   UNION ALL SELECT 3
   ...
   UNION ALL SELECT 24) as h
LEFT OUTER JOIN  (
   SELECT datepart(hh, order_date) as hour, SUM(order_id) as sum
      FROM ORDERS
      GROUP BY datepart(hh, order_date) ) as s 
  ON h.hour = s.hour;
2
ответ дан 3 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: