Я пытаюсь сгруппировать приведенные ниже образцы данных по дате и цене.
КОД ПРОДУКТА | PRICING_DATE | ЦЕНА |
---|---|---|
1234 | 01-01-2022 | 23.9 |
1234 | 02-01-2022 | 23.9 |
1234 | 03-01-2022 | 23.9 |
1234 | 04-01-2022 | 22.9 |
1234 | 05-01-2022 | 22.9 |
1234 | 06-01-2022 | 24.9 |
1234 | 07-01-2022 | 24.9 |
1234 | 08-01-2022 | 23.9 |
1234 | 09-01-2022 | 23.9 |
Решение проблемы
диапазон дат для цены 23,9 неверен, потому что цена не одинакова для всех дней в этом диапазоне.
Поскольку есть два одинаковых price
в разных перекрывающихся диапазонах дат, вы можете получить только одну строку при использовании агрегатной функции.
Это проблема промежутка и острова, мы можем попытаться использовать ROW_NUMBER
оконную функцию, чтобы получить промежутки перекрывающихся дат, а затем group by
это.
SELECT Product_Code,
min(Pricing_Date) AS Min_Date,
max(Pricing_Date) AS Max_Date,
price
FROM (
SELECT *,
ROW_NUMBER() OVER(ORDER BY PRICING_DATE) - ROW_NUMBER() OVER(PARTITION BY PRODUCT_CODE,PRICE ORDER BY PRICING_DATE) grp
FROM PRICE_DATA
) t1
GROUP BY grp,Product_Code,price
ORDER BY min(Pricing_Date)
Объяснять
Проблема промежутка и острова является особенностью
непрерывные (перекрывающиеся) данные заключаются в том, что набор
(continuous range of sequence) - (values based on a certain order of conditions sequence)
дает одну и ту же группировку.
чтобы Мы могли использовать
ROW_NUMBER() OVER(ORDER BY PRICING_DATE)
создание непрерывного диапазона значений.ROW_NUMBER() OVER(PARTITION BY PRODUCT_CODE,PRICE ORDER BY PRICING_DATE)
создание значений на основе определенного порядка условий.Затем мы получим столбец группировки с перекрывающимися данными как sqlfiddle
Комментариев нет:
Отправить комментарий