У меня есть запрос, подобный приведенному ниже, чтобы найти информацию об акциях некоторых продуктов. Запрос работает нормально, но я думаю, что он недостаточно эффективен и быстр (БД: postgresql версия 11).
Там это CTE "result_set" в этом коде, где мне нужно найти "количество заказанного товара" (qty_last_7d_from_oos_date) за период между отсутствием на складе и последними 7 днями до даты отсутствия на складе. Примерно так я должен найти доход также.
Итак, я написал один и тот же подзапрос два раза, один вывод дохода, а другой - количество, которое не является эффективным шагом. У кого-то есть какие-либо предложения о том, как переписать это и сделать его эффективным code.
WITH final as
(
SELECT product_id,product_name,item_sku,out_of_stock_at
,out_of_stock_at - INTERVAL '7 days' as previous_7_days
,back_in_stock_at
FROM oos_base
)
SELECT product_id,product_name,item_sku,out_of_stock_at,previous_7_days
,back_in_stock_at
,(SELECT coalesce(sum(i.qty_ordered), 0) AS qty_last_7d_from_oos_date
FROM ol.orders o
LEFT JOIN ol.items i ON i.order_id = o.order_id
LEFT JOIN ol.products p ON p.product_id = i.product_id AND i.store_id = p.store_id
WHERE o.order_state_2 IN('complete','processing')
AND f.product_id=p.product_id
AND o.created_at_order :: DATE BETWEEN f.previous_7_days::DATE AND COALESCE(f.out_of_stock_at::DATE,current_date)
)
,( SELECT coalesce(sum(i.row_amount_minus_discount_order), 0) AS rev_last_7d_from_oos_date
FROM ol.orders o
LEFT JOIN ol.items i ON i.order_id = o.order_id
LEFT JOIN ol.products p ON p.product_id = i.product_id AND i.store_id = p.store_id
WHERE o.order_state_2 IN('complete','processing')
AND f.product_id=p.product_id
AND o.created_at_order :: DATE BETWEEN f.previous_7_days::DATE AND COALESCE(f.out_of_stock_at::DATE,current_date)
)
FROM final f
В приведенном выше коде CTE "final" дает вам две даты "out_of_stock_at" и "previous_7_days". Я хочу найти количество и доход продукта, основываясь на этих двух датах, в промежутке между «предыдущими_7_днями» и «out_of_stock_at».
В приведенном ниже запросе будет указано количество и доход продуктов, но за период между «предыдущими_7_днями» & "out_of_stock_at" из вышеуказанного CTE.
На данный момент я использовал приведенный ниже код два раза для получения информации о доходах и количестве.
SELECT coalesce(sum(i.qty_ordered), 0) AS qty ,
coalesce(sum(i.row_amount_minus_discount_order), 0)
FROM ol.orders o
LEFT JOIN ol.items i ON i.order_id = o.order_id
LEFT JOIN ol.products p ON p.product_id = i.product_id AND i.store_id = p.store_id
WHERE o.order_state_2 IN('complete','processing')
AND f.product_id=p.product_id
AND o.created_at_order :: DATE BETWEEN f.previous_7_days::DATE AND COALESCE(f.out_of_stock_at::DATE,current_date)