sql >> Database teknologi >  >> RDS >> PostgreSQL

Få de eneste seneste data fra sidste uge, og summer en kolonne

Jeg tror, ​​at dette matcher dit forventede resultat:

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
 

Resultat:

+----+-------+----------------+---------+---------------------+-----+-----+-----+-----+ | | 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 | +----+-------+----------------+---------+---------------------+-----+-----+-----+-----+

Se:http://rextester.com/ISHS42170

For forhold som "seneste" synes jeg, at brug af ROW_NUMBER() OVER() er det mest bekvemme, da det giver mulighed for at returnere hele rækken af ​​hver "seneste" hændelse, hvilket ikke er helt så simpelt, hvis du bruger MAX() og GRUPPE EFTER. "Distinkte" resultater returneres ved at filtrere rækkerne med værdien 1 returneret af funktionen.

+EDIT

I stedet for at bruge where rn in (1,2) Jeg tror, ​​at en bedre måde ville have været bedre at bruge stregkode i OVER(PARTITION BY...) betingelser, som denne:

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. SQL:IF-sætning i WHERE-sætning

  2. Hvordan opretter man et SQL-array fra en Java-liste?

  3. Forsøger at opdatere 640k rækker i mySQL mister forbindelsen til MySQL-serveren under forespørgsel

  4. Barman 2.11:barman-cloud-restore og barman-cloud-wal-restore