Коррелированный подзапрос в Postgres - PullRequest
0 голосов
/ 11 марта 2020

У меня есть запрос, подобный приведенному ниже, чтобы найти информацию об акциях некоторых продуктов. Запрос работает нормально, но я думаю, что он недостаточно эффективен и быстр (БД: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...