मुझे लगता है कि इसे एक पुनरावर्ती CTE का उपयोग करके हल किया जा सकता है:
with change_tree as
(
SELECT order_id,
previous_status_id,
next_status_id,
cast(next_status_id as varchar(max)) as status_path
FROM status_change
WHERE previous_status_id = 1
AND order_id = 2
UNION ALL
SELECT sc.order_id,
sc.previous_status_id,
sc.next_status_id,
ct.status_path + ',' + cast(sc.next_status_id as varchar(max))
FROM status_change sc
JOIN change_tree ct ON ct.next_status_id = sc.previous_status_id AND ct.order_id = sc.order_id
)
SELECT *
FROM change_tree
WHERE status_path = '2,3,5';
यह अनिवार्य रूप से क्या करता है (पुनरावर्ती रूप से) next_status_id के सभी मानों को एक एकल स्ट्रिंग में संयोजित करना है जिससे आप तुलना कर सकते हैं।
आपके नमूना डेटा से मुझे यह स्पष्ट नहीं है कि कौन सी पंक्ति किसी ऑर्डर स्थिति परिवर्तन इतिहास की "शुरुआत" को चिह्नित करती है। सही "शुरुआती" पंक्ति का चयन करने के लिए आपको संघ के पहले भाग में कहाँ समायोजित करना होगा।