Выберите строки, в которых значение столбца изменилось С согласованием

#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. Спасибо, Томас.. Это сработало при первом запуске. Ты потрясающая :).