У нас есть 2 таблицы:
- продажа
- час (только 1 поле (час) чисел: от 0 до 23)
Цельэто перечислить все даты и все 24 часа для каждого дня и групповых часов, которые имеют продажи.Для часов, которые не имеют продаж, будет показан ноль.
Этот перекрестный запрос соединяет таблицу продаж с таблицей часов и содержит список всех дат и 24 часов.Тем не менее, есть также много повторяющихся строк.Как мы можем избежать дубликатов?
Мы используем Amazon Redshift (на основе Postgres 8.0).
with h as (
SELECT
a.purchase_date,
CAST(DATE_PART("HOUR", AT_TIME_ZONE(AT_TIME_ZONE(CAST(a.purchase_date AS
DATETIME), "0:00"), "PST")) as INTEGER) AS Hour,
COUNT(a.quantity) AS QtyCount,
SUM(a.quantity) AS QtyTotal,
SUM((a.price) AS Price
FROM sales a
GROUP BY CAST(DATE_PART("HOUR",
AT_TIME_ZONE(AT_TIME_ZONE(CAST(a.purchase_date AS DATETIME), "0:00"),
"PST")) as INTEGER),
DATE_FORMAT(AT_TIME_ZONE(AT_TIME_ZONE(CAST(a.purchase_date AS DATETIME),
"0:00"), "PST"), "yyyy-MM-dd")
ORDER by a.purchase_date
),
hr as (
SELECT
CAST(hourt AS INTEGER) AS hourt
FROM hourt
),
joined as (
SELECT
purchase_date,
hourt,
QtyCount,
QtyTotal,
Price
FROM h
cross JOIN hr
)
SELECT *
FROM joined
Order by purchase_date,hourt
Образцы таблиц:
Перед перекрестным объединением запроситевернули правильные продажи и сгруппированные часы, как показано в таблице ниже.
Таблица желаемых результатов: