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

PostgreSQL - giá trị cột đã thay đổi - chọn tối ưu hóa truy vấn

Đây là cách tôi sẽ làm điều đó với một phân tích:

SELECT id, val
  FROM ( SELECT id, val
           ,LAG(val) OVER (ORDER BY id) AS prev_val
       FROM p ) x
  WHERE val <> COALESCE(prev_val, val)
  ORDER BY id

Cập nhật (một số giải thích):

Các chức năng phân tích hoạt động như một bước xử lý sau. Kết quả truy vấn được chia thành các nhóm (partition by ) và hàm phân tích được áp dụng trong ngữ cảnh của một nhóm.

Trong trường hợp này, truy vấn là một lựa chọn từ p . Hàm phân tích đang được áp dụng là LAG . Vì không có partition by mệnh đề, chỉ có một nhóm:toàn bộ tập kết quả. Nhóm này được sắp xếp theo id . LAG trả về giá trị của hàng trước đó trong nhóm bằng cách sử dụng thứ tự đã chỉ định. Kết quả là mỗi hàng có một cột bổ sung (bí danh pres_val) là val của hàng trước. Đó là truy vấn con.

Sau đó, chúng tôi tìm kiếm các hàng có val không khớp với val của hàng trước đó (giá trị trước). COALESCE xử lý trường hợp đặc biệt của hàng đầu tiên không có giá trị trước đó.

Lúc đầu, các hàm phân tích có vẻ hơi lạ, nhưng khi tìm kiếm các hàm phân tích sẽ tìm thấy rất nhiều ví dụ về cách chúng hoạt động. Ví dụ: http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Chỉ cần nhớ rằng đó là một bước xử lý hậu kỳ. Bạn sẽ không thể thực hiện lọc, v.v. về giá trị của một hàm phân tích trừ khi bạn truy vấn phụ nó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận n danh mục được nhóm lại và tổng hợp các danh mục khác thành một

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

  3. Cách chạy một công việc được tạo qua pgagent trong Postgres

  4. Cách tốt nhất để mô hình hóa mối quan hệ nhiều người

  5. Dịch vụ PostgreSQL không thể dừng / bắt đầu / khởi động lại