GOOGLE ADS

среда, 4 мая 2022 г.

Как сгруппировать данные на основе непрерывного диапазона дат?

Я пытаюсь сгруппировать приведенные ниже образцы данных по дате и цене.






















































КОД ПРОДУКТАPRICING_DATEЦЕНА
123401-01-202223.9
123402-01-202223.9
123403-01-202223.9
123404-01-202222.9
123405-01-202222.9
123406-01-202224.9
123407-01-202224.9
123408-01-202223.9
123409-01-202223.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)

sqlfiddle

Объяснять

Проблема промежутка и острова является особенностью


непрерывные (перекрывающиеся) данные заключаются в том, что набор (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

    Комментариев нет:

    Отправить комментарий

    Laravel Datatable addColumn returns ID of one record only

    Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...