PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Dapatkan satu-satunya data terbaru dari minggu lalu dan jumlahkan beberapa kolom

Saya rasa ini cocok dengan hasil yang Anda harapkan:

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

Hasil:

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

Lihat:http://rextester.com/ISHS42170

Untuk kondisi seperti "terbaru" saya menemukan bahwa menggunakan ROW_NUMBER() OVER() adalah yang paling nyaman karena memungkinkan seluruh baris dari setiap acara "terbaru" dikembalikan yang tidak begitu sederhana jika menggunakan MAX() dan KELOMPOK OLEH. Hasil "Berbeda" dikembalikan dengan memfilter baris yang memiliki nilai 1 yang dikembalikan oleh fungsi.

+EDIT

Alih-alih menggunakan where rn in (1,2) Saya percaya cara yang lebih baik akan lebih baik menggunakan kode batang dalam kondisi OVER(PARTITION BY...), seperti ini:

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. Rel metode yang tidak ditentukan untuk ActiveRecord_Associations_CollectionProxy

  2. Mengekspor Tabel AWS Postgres RDS ke AWS S3

  3. Masalah menggunakan pg_search dengan asosiasi polimorfik

  4. Agregat PostgreSQL khusus untuk rata-rata melingkar

  5. Menyebarkan proyek Django di Google Cloud App Engine dengan perpustakaan eksternal