मान लें कि ऑडिट तालिका भी lease_period को लॉग करती है प्राथमिक कुंजी कॉलम, यहां संदर्भित lp_id सरलता के लिए, आप निम्न उपाय आजमा सकते हैं:
-
वे सभी पंक्तियाँ खोजें जहाँ
audit_type'Updated'। -
सभी पंक्तियों को
audit_date. के अनुसार रैंक करें और उन्हेंlp_id. द्वारा विभाजित करना । -
पंक्तियों को
audit_dateby के अनुसार रैंक करेंlp_id, suite_id, lease_id, building_id. द्वारा विभाजन । -
दो रैंकिंग के बीच अंतर प्राप्त करें।
-
audit_date. के अनुसार पंक्तियों को फिर से रैंक करें , उन्हें अबlp_id, suite_id, lease_id, building_id, (ranking_difference)के आधार पर विभाजित करना । -
उन सभी पंक्तियों को आउटपुट करें जहां अंतिम रैंकिंग मान 2 या अधिक है।
पहले चार चरणों का परिणाम एक पंक्ति सेट में होता है जहां लगातार प्रत्येक समूह (audit_date के आरोही क्रम में) ) suite_id, lease_id, building_id . के समान मानों वाली पंक्तियाँ उसी के लिए lp_id रैंकिंग #2 और #3 के बीच के अंतर के रूप में परिकलित मान द्वारा विशिष्ट रूप से अलग किया जाएगा।
समूह के भीतर, प्रत्येक पंक्ति, दूसरी पंक्ति से शुरू होकर, पिछली पंक्ति से केवल tenant_trading_name के मान में भिन्न होगी। , जो बस हमें चाहिए। इसलिए, हम पंक्तियों को एक बार फिर से रैंक करते हैं, हमारे द्वारा अभी प्राप्त 'ग्रुप आईडी' को ध्यान में रखते हुए, फिर प्रत्येक पंक्ति को 2 या उच्चतर की रैंकिंग के साथ लौटाते हैं।
यहाँ एक अनुमानित कार्यान्वयन है:
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
टिप्पणी। यह मानता है कि ऑडिट तालिका केवल वास्तविक परिवर्तनों को लॉग करती है, यानी एक ही प्राथमिक कुंजी के साथ लगातार दो पंक्तियाँ नहीं हो सकती हैं जहाँ सभी चार स्तंभों का मान समान हो।