SELECT
Операция SELECT служит для выборки данных. Запрос состоит из:
- списка полей для выборки
- имени таблицы
- условия
- списка полей для группировки (не обязательно)
- условия фильтрации по сгруппированным данным (не обязательно)
Условие является обязательным и должно содержать как минимум временной интервал (
time > x AND time < y
). Если условие содержит выражениеOR
то временной интервал должен быть определен для каждого из подусловий.
Примеры запросов
Суммы продаж для указанной кассы за указанный период с разбивкой по дням:
SELECT sum(sum), day(time) as d, kkmId
FROM items_kkm
WHERE time >= TIMESTAMP '2019-06-01' AND time < TIMESTAMP '2019-07-01' AND kkmId = '10'
GROUP BY d, kkmId
Суммы продаж товаров в которых встречается слово “штангенциркуль” за указанный период с разбивкой по дням:
SELECT
sum(sum), day(time) as d, kkmId
FROM
items_kkm
WHERE
time >= TIMESTAMP '2019-06-01' AND
time < TIMESTAMP '2019-07-01' AND
itemsInvertedIndex_phrase = 'штангенциркуль'
GROUP BY
d, kkmId
Время первой и последней продажи селедки за сутки:
SELECT
min(time) as mint, max(time) as maxt, day(time) as d
FROM items_kkm
WHERE
time >= TIMESTAMP '2019-06-01' AND
time < TIMESTAMP '2019-07-01' AND
itemsInvertedIndex_phrase = 'селедка'
GROUP BY d
Считаем количество продаж товаров, купленных в количестве больше 10:
SELECT
item,
sum(
CASE
WHEN quantity > 9 THEN 1
ELSE 0
)
FROM items_kkm
WHERE
time >= TIMESTAMP '2019-06-01'
AND time < TIMESTAMP '2019-07-01'
GROUP BY item
Применяем фильтры после расчета оконной функции:
SELECT
kkmId,
time AS t,
lag(time) AS l
FROM receipt
WHERE time >= TIMESTAMP '2019-06-01' AND time < TIMESTAMP '2019-07-01'
GROUP BY kkmId
HAVING
((l - t) > INTERVAL '2' HOUR AND extract_hour(t) >= 8 AND extract_hour(t) <= 18) OR
((l - t) > INTERVAL '4' HOUR AND extract_hour(t) > 18 OR extract_hour(t) < 8)
Выбираем предыдущие три месяца:
SELECT sum(sum), day(time) as d, kkmId
FROM items_kkm
WHERE time >= trunc_month(now() - INTERVAL '3' MONTH) AND time < trunc_month(now())
GROUP BY d, kkmId
Агрегация по выражению:
SELECT kkmId,
(CASE WHEN totalReceiptCardSum > 0 THEN 1 ELSE 0) as paymentType
FROM items_kkm
WHERE time >= TIMESTAMP '2019-06-01' AND time < TIMESTAMP '2019-07-01'
GROUP BY paymentType, kkmId
Используем арифметику (+
, -
, *
, /
):
SELECT sum(totalSum) as ts, sum(cardSum) * max(cashSum) / 2 as something
FROM receipt
WHERE
time >= TIMESTAMP '2019-06-01' AND time < TIMESTAMP '2019-07-01' AND
kkmId = '11'
GROUP BY kkmId
Группируем колбасу по вкусу и считаем сумму:
SELECT
item,
case
when contains_any(stem(item), stem('вареная')) then 'вареная'
when contains_any(stem(item), stem('соленая')) then 'соленая'
else 'невкусная' as taste,
sum(sum)
FROM items_kkm
WHERE
time >= TIMESTAMP '2019-06-01' AND time < TIMESTAMP '2019-07-01'
AND itemsInvertedIndex_phrase = 'колбаса'
GROUP BY item, taste
Использование ИЛИ для выборки по нескольким временным отрезкам:
SELECT trunc_day(time) as day, item, sum(sum) as sum
FROM items_kkm
WHERE ItemsInvertedIndex_phrase = 'лук' AND (
(time >= TIMESTAMP '2021-08-01' AND time < TIMESTAMP '2021-08-08') OR
(time >= TIMESTAMP '2022-08-01' AND time < TIMESTAMP '2022-08-08')
)
GROUP BY day, item
Использование ИЛИ для выборки по нескольким условиям:
SELECT trunc_day(time) as day, item, sum(sum) as sum
FROM items_kkm
WHERE (
(ItemsInvertedIndex_phrase = 'лук' AND kkmId IN (1,2,3)) OR
(itemsInvertedIndex_phrase = 'чеснок' AND kkmId IN (4,5,6))
) AND time >= TIMESTAMP '2022-08-01' AND time < TIMESTAMP '2022-08-08'
GROUP BY day, item
Использование null:
SELECT
trunc_day(time) as day,
item,
avg(CASE
WHEN quantity > 0 then sum / quantity
ELSE null
) AS avg_price
FROM kkm_items
WHERE time >= TIMESTAMP '2023-06-01' AND time < TIMESTAMP '2023-07-01'