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

Truy vấn trợ giúp khi sử dụng bảng kiểm tra

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:

  1. Tìm tất cả các hàng có audit_type'Updated' .

  2. Xếp hạng tất cả các hàng theo audit_date và phân vùng chúng theo lp_id .

  3. Xếp hạng các hàng theo audit_date phân vùng theo lp_id, suite_id, lease_id, building_id .

  4. Nhận sự khác biệt giữa hai thứ hạng.

  5. Xếp hạng lại các hàng theo audit_date , phân vùng chúng ngay bây giờ theo lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Express so với express localdb

  2. Không thể nhập dữ liệu từ excel 2003 vào cơ sở dữ liệu bằng hàm openrowset

  3. Kiểm tra xem một ngày nhất định có phù hợp với một phạm vi ngày không

  4. Làm thế nào để gán một kết quả thực thi cho một biến sql?

  5. Không có Tập dữ liệu được chia sẻ nào trong trình khám phá giải pháp của studio phát triển trí tuệ doanh nghiệp