PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पिछले सप्ताह का केवल नवीनतम डेटा प्राप्त करें और कुछ कॉलम का योग करें

मुझे लगता है कि यह आपके अपेक्षित परिणाम से मेल खाता है:

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

http://rextester.com/SCV98254



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JOOQ का उपयोग करके PostgreSQL में UPSERT

  2. अनुक्रमणिका में स्तंभ की स्थिति

  3. PostgreSQL को R . से जोड़ना

  4. पोस्टग्रेएसक्यूएल तालिका में ज़िपित सीएसवी (filename.csv.gz) फ़ाइल लोड हो रही है

  5. PostgreSQL में मॉनिटर करने के लिए मुख्य चीजें - आपके कार्यभार का विश्लेषण