#sql
Вопрос:
У меня есть данные в этом формате.
[
(Продавец, цена, дата)
(A, 10, 2021-01-01)
(А, 20, 2021-01-02)
(А, 20, 2021-01-03)
(A, 30, 2021-01-04)
(Б, 20, 2021-01-05)
(Б, 40, 2021-01-06)
(C, 20, 2021-01-07)
(А, 20, 2021-01-08)
(А, 20, 2021-01-09)
(А, 20, 2021-01-10)
(A, 10, 2021-01-11)
(D, 10, 2021-01-12)
(D, 20, 2021-01-13)
(D, 10, 2021-01-14)
(C, 40, 2021-01-15)
(C, 40, 2021-01-16)
(A, 10, 2021-01-17)
]
Я хочу создать запрос, который может дать мне следующий результат.
[
(Продавец, Avg_Price, From_Date, To_Date)
(А, (10 20 20 30) / 4, 2021-01-01, 2021-01-04)
(B, (20 40) / 4, 2021-01-05, 2021-01-06)
(С, (20) / 1, 2021-01-07, 2021-01-07)
(А, (20 20 20 10) / 4, 2021-01-08, 2021-01-11)
(D, (10 20 10) / 3, 2021-01-12, 2021-01-14)
(C, (40 40) / 2, 2021-01-15, 2021-01-16)
(А, (10) / 1, 2021-01-17, 2021-01-17)
]
Я изо всех сил пытаюсь управлять группой данных, так как один и тот же розничный торговец может прийти снова, но я хочу рассмотреть это по-другому, если цепочка разорвана.
Дайте мне знать, если вам понадобится более подробная информация. заранее спасибо.
Комментарии:
1. sql server или bigquery?
Ответ №1:
Используйте функции окна — сначала вычислите флаг, значение которого равно 1 при каждом изменении продавца, затем вычислите номера групп как сумму этих флагов с самого начала, чтобы первая группа имела значение 1, вторая группа 2 и т. Д…., Затем Сгруппируйте по номеру группы и вычислите то, что вам нужно.
select min(seller) as Seller
, avg(price) as Avg_Price
, min(date) as From_Date
, max(date) as To_Date
from (
select seller, price, date, sum(seller_chaned) over (order by date) as grp
from (
select seller, price, date
, case when lag(seller) over (order by date) != seller then 1 else 0 end as seller_changed
from t
)
)
group by grp
order by grp
(Обратите внимание, что я составил запрос только в своей голове, поэтому могут быть опечатки или отдельные ошибки, но я надеюсь, что идея очевидна. Лучше предоставить dbfiddle примеры данных.)
Комментарии:
1. Спасибо, Томас.. Это сработало при первом запуске. Ты потрясающая :).