PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Nhận dữ liệu mới nhất duy nhất từ ​​tuần trước và tổng hợp một số cột

Tôi nghĩ điều này phù hợp với kết quả mong đợi của bạn:

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

Kết quả:

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

Xem: http://rextester.com/ISHS42170

Đối với các điều kiện như "gần đây nhất", tôi thấy rằng việc sử dụng ROW_NUMBER () OVER () là thuận tiện nhất vì nó cho phép trả về toàn bộ hàng của mỗi sự kiện "gần đây nhất", điều này không quá đơn giản nếu sử dụng MAX () và NHÓM THEO. Kết quả "khác biệt" được trả về bằng cách lọc các hàng có giá trị 1 do hàm trả về.

+ CHỈNH SỬA

Thay vì sử dụng where rn in (1,2) Tôi tin rằng một cách tốt hơn sẽ tốt hơn là sử dụng mã vạch trong các điều kiện OVER (PARTITION BY ...), như sau:

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. PostgreSQL, số hàng giữa ngày tối thiểu và ngày tối đa

  2. PGError:ERROR:quyền bị từ chối đối với mối quan hệ (khi sử dụng Heroku)

  3. Thay đổi cổng máy chủ vùng chứa postgres trong Docker Compose

  4. chỉ mục postgresql trên cột chuỗi

  5. Cách cài đặt PostgreSQL 12 trên Fedora 33