मुझे लगता है कि यह आपके अपेक्षित परिणाम से मेल खाता है:
select "user", "contact", "barcode", "date", "in", "out","dif"
, sum("in"-"out") over(partition by "user", "contact") as "sum"
from (
select "user", "contact", "barcode", "date", "in", "out","dif"
, lag(dif,1) over(partition by "user", "contact" order by "date" ASC) prevdif
, row_number() over(partition by "user", "contact" order by "date" DESC) rn
from "table1"
where date_trunc('day', "date") <= '2017-06-25' ::date - ( interval '1 week')::interval
and "date" > '2017-06-25'::date - ( interval '2 weeks')::interval
) d
where rn in (1,2) and prevdif is not null
order by 1,2,4 DESC
परिणाम:
+----+-------+----------------+---------+---------------------+-----+-----+-----+-----+
| | user | contact | barcode | date | in | out | dif | sum |
+----+-------+----------------+---------+---------------------+-----+-----+-----+-----+
| 1 | USER2 | Guillermo Tole | 987654 | 16.06.2017 05:27:00 | 500 | 420 | 80 | 170 |
| 2 | USER2 | Guillermo Tole | 281460 | 15.06.2017 05:36:00 | 310 | 220 | 90 | 170 |
| 3 | USER3 | Juan Rulfo | 123456 | 15.06.2017 05:37:00 | 450 | 300 | 150 | 150 |
| 4 | USER3 | Pepito Marquez | 346234 | 15.06.2017 05:37:00 | 600 | 360 | 240 | 240 |
+----+-------+----------------+---------+---------------------+-----+-----+-----+-----+
देखें:http://rextester.com/ISHS42170
"सबसे हालिया" जैसी स्थितियों के लिए मुझे लगता है कि ROW_NUMBER() ओवर() का उपयोग करना सबसे सुविधाजनक है क्योंकि यह प्रत्येक "सबसे हालिया" घटना की पूरी पंक्ति को वापस करने की अनुमति देता है जो MAX() का उपयोग करते समय इतना आसान नहीं है और समूह द्वारा। फ़ंक्शन द्वारा लौटाए गए मान 1 वाली पंक्तियों को फ़िल्टर करके "विशिष्ट" परिणाम लौटाए जाते हैं।
+संपादित करें
where rn in (1,2)
. का उपयोग करने के बजाय मेरा मानना है कि OVER(PARTITION BY...) स्थितियों में बारकोड का उपयोग करने का एक बेहतर तरीका बेहतर होता, जैसे:
select "user", "contact", "barcode", "date", "in", "out","dif"
, sum("in"-"out") over(partition by "user", "contact") as "sum"
from (
select "user", "contact", "barcode", "date", "in", "out","dif"
, lag(dif,1) over(partition by "user", "contact", "barcode" order by "date" ASC) prevdif
, row_number() over(partition by "user", "contact", "barcode" order by "date" DESC) rn
from "table1"
where date_trunc('day', "date") <= '2017-06-25' ::date - ( interval '1 week')::interval
and "date" > '2017-06-25'::date - ( interval '2 weeks')::interval
) d
where rn = 1 and prevdif is not null
order by 1,2,4 DESC