Đâ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ó.