Giả sử bảng kiểm tra cũng ghi lại lease_period
cột khóa chính, được tham chiếu ở đây lp_id
để đơn giản, bạn có thể thử cách tiếp cận sau:
-
Tìm tất cả các hàng có
audit_type
là'Updated'
. -
Xếp hạng tất cả các hàng theo
audit_date
và phân vùng chúng theolp_id
. -
Xếp hạng các hàng theo
audit_date
phân vùng theolp_id, suite_id, lease_id, building_id
. -
Nhận sự khác biệt giữa hai thứ hạng.
-
Xếp hạng lại các hàng theo
audit_date
, phân vùng chúng ngay bây giờ theolp_id, suite_id, lease_id, building_id, (ranking_difference)
. -
Xuất ra tất cả các hàng có giá trị xếp hạng cuối cùng là 2 hoặc lớn hơn.
Bốn bước đầu tiên dẫn đến một tập hợp hàng trong đó mỗi nhóm liên tiếp (theo thứ tự tăng dần của audit_date
) các hàng có các giá trị giống hệt nhau của suite_id, lease_id, building_id
cho cùng một lp_id
sẽ được phân biệt duy nhất bằng một giá trị được tính là hiệu số giữa thứ hạng # 2 3.
Trong nhóm, mọi hàng, bắt đầu từ hàng thứ hai, sẽ khác với hàng trước chỉ ở giá trị của tenant_trading_name
, đó chỉ là những gì chúng ta cần. Vì vậy, chúng tôi xếp hạng các hàng một lần nữa, có tính đến 'ID nhóm' mà chúng tôi vừa lấy được, sau đó trả lại mọi hàng có xếp hạng từ 2 trở lên.
Đây là cách triển khai gần đúng:
WITH marked AS (
SELECT
*,
grp = ROW_NUMBER() OVER (PARTITION BY lp_id
ORDER BY audit_date)
- ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id
ORDER BY audit_date)
FROM lease_period_audit
WHERE audit_type = 'Updated'
),
ranked AS (
SELECT
*,
rnk = ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id, grp
ORDER BY audit_date)
FROM marked
)
SELECT
audit_date,
lp_id,
tenant_trading_name,
suite_id,
lease_id,
building_id
FROM ranked
WHERE rnk = 2
Ghi chú. Điều này giả định rằng bảng kiểm tra chỉ ghi lại những thay đổi thực sự, tức là không thể có hai hàng liên tiếp với cùng một khóa chính trong đó tất cả bốn cột đều có giá trị giống hệt nhau.