简体   繁体   中英

postgresql complex group by in query

I have a query that gives:

itemid deadlineneeded delievrydate quantity 
200  15/07/15        14/07/15     5     
200  15/07/15        14/07/15     10
200  15/07/15        13/07/15     25
201  15/07/15        14/07/15     30
200  14/07/15        10/07/15     3
201  15/07/15        15/07/15     100

It gives the information from multiple tables. Basically it means When items arrive to warehouse (delievrydate) and how many. The deadlineneeded means when i'm going to use it.

My goal is to find out the total quantity of itemid that arrives 1 day before deadlineeded.

for example with the last data I want to get:

itemid deadlineneeded    quantity
200         15/07/15      43 (5+10+25+3)  
200         14/07/15      3    //5+10+25 not included because deliverydate
201         15/07/15     30    //100 not included because deliverydate

How do i get it?

SELECT itemid, deadlineneeded, sum(quantity) AS total_quantity
FROM <your table>
WHERE (deadlineneeded - delievrydate)::int >= 1
GROUP BY 1, 2
ORDER BY 1, 2;

This uses a "delievrydate" (looks like a typo to me) that is at least 1 day before the "deadlineneeded" date, as your sample data is suggesting.

select distinct date_trunc('day',deadlineneeded),sum from 
(select *,sum(quantity) over (partition by deadlineneeded-delievrydate) from     tablename) t 
where deadlineneeded-delievrydate = '1 day';

Use GROUP BY combined with aggregate function SUM .

select itemid, deadlineneeded, SUM(quantity)
from tablename
where deadlineneeded = delievrydate + 1
group by itemid, deadlineneeded

The where deadlineneeded = delievrydate + 1 part is typically product specific, and I don't know postgresql... ANSI SQL has deadlineneeded = delievrydate + interval'1' day .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM