2013-09-27 4 views
1

Я сделал запрос, чтобы принести мне количество продуктов, которые не были на складе (я знаю, что, посмотрев заказы, которые производитель вернул с некоторым кодом состояния), продукт, дата и хранения, который выглядит следующим образом:Подсчитайте количество записей, сгруппированных по некоторым строкам

SELECT count(*) as out_of_stock, 
prod.id as product_id, 
ped.data_envio::date as date, 
opl.id as storage_id 
from sub_produtos_pedidos spp 
left join cad_produtos prod ON spp.ean_produto = prod.cod_ean 
left join sub_pedidos sp ON spp.id_pedido = sp.id 
left join pedidos ped ON sp.id_pedido = ped.id 
left join op_logisticos opl ON sp.id_op_logistico = opl.id 
where spp.motivo = '201' -- this is the code that means 'not in inventory' 
group by storage_id,product_id,date 

это дает ответ так:

out_of_stock | product_id | date  | storage_id 
--------------|------------|-------------|------------- 
1   | 5   | 2012-10-16 | 1 
5   | 4   | 2012-10-16 | 2 

Теперь мне нужно, чтобы получить число вхождений, по видам продукции и хранения продуктов, были в наличии в течение 2 или более дней, 5 или более дней и так далее.
Так что, я думаю, мне нужно сделать новый счет для первого запроса, агрегируя результирующие строки в определенные определенные интервалы времени.

Я пробовал смотреть функции datetime в Postgres (http://www.postgresql.org/docs/7.3/static/functions-datetime.html), но не смог найти то, что мне нужно.

+0

Вы должны рассказать нам больше о взаимосвязи между таблицами. Являются ли эти отношения 1: 1? Или 1: n? Почему ЛЕВЫЕ ПРИСОЕДИНЯЮТСЯ? В каких таблицах нет соответствующих строк? –

ответ

0

С вы, кажется, хотите каждой строки в результате отдельно, вы не можете агрегировать. Используйте window function вместо этого, чтобы получить счет в день. Хорошо известно, агрегатная функция count() может также служить в качестве окна функции совокупного:

SELECT current_date - ped.data_envio::date AS days_out_of_stock 
     ,count(*) OVER (PARTITION BY ped.data_envio::date) AS count_per_days_out_of_stock 
     ,ped.data_envio::date AS date 
     ,p.id     AS product_id 
     ,opl.id    AS storage_id 
FROM sub_produtos_pedidos spp 
LEFT JOIN cad_produtos p ON p.cod_ean = spp.ean_produto 
LEFT JOIN sub_pedidos  sp ON sp.id  = spp.id_pedido 
LEFT JOIN op_logisticos opl ON opl.id = sp.id_op_logistico 
LEFT JOIN pedidos   ped ON ped.id = sp.id_pedido 
WHERE spp.motivo = '201'     -- code for 'not in inventory' 
ORDER BY ped.data_envio::date, p.id, opl.id

Порядок сортировки: Продукты побывав в наличии в течение самого долгого времени первого.
Примечание. Вы можете просто вычесть dates, чтобы получить integer в Postgres.

Если вы хотите работает счетчик в смысле «п строк были в наличии для этого количества дней или более», использование:

count(*) OVER (ORDER BY ped.data_envio::date) -- ascending order! 
             AS running_count_per_days_out_of_stock 

Вы получаете тот же счетчик для в тот же день сверстники сосредоточены вместе.

1

Может быть, я не понял, что вы задали вопрос, но, похоже, вам нужен подзапрос рычага.

Теперь мне нужно получить количество вхождений, по видам продукции и хранения продуктов, которые были в наличии в течение 2-х или более дней

Так:

SELECT COUNT(*), date, product_id FROM (YOUR BIG QUERY IS THERE) a 
WHERE a.date < (CURRENT_DATE - interval '2' day) 
GROUP BY date, product_id 
+0

Я пробовал что-то подобное. Но мне действительно нужно отделить ответ от отдельных групп: «продукты, которые были в наличии в течение двух или более дней», «продукты, которые были в наличии в течение пяти или более дней», «продукты, которые были вне акций в течение десяти или более дней », складом. Я не знаю, есть ли простой способ сделать это в SQL. Мне нужно положить это в кубик OLAP для создания отчета, возможно, запросив куб с помощью MDX, это проще ... – Pedro

Смежные вопросы