आप ऐसा कुछ कर सकते हैं।
ROW_NUMBER()
का उपयोग करके प्रत्येक अभिभावक के पहले और अंतिम अक्षर की पहचान करें औरPARTITION BY
- पिछले
ids
के पिछले रिकॉर्ड का मिलान करें अगलेids
. के पहले रिकॉर्ड के साथ . - जांचें कि क्या दूसरी पैरेंट आईडी में कोई अक्षर है जो ऊपर चुने गए अक्षर से मेल खाता है
- एक
LEFT JOIN
का उपयोग करें औरCASE
. का उपयोग करें याISNULL
ऐसेids
. के लिए उच्च प्राथमिकता निर्धारित करने के लिए रिकॉर्ड जिसमें पत्र मेल खाता था
क्वेरी
;WITH CTE AS
(
SELECT id,ParentID,letter,
ROW_NUMBER()OVER(PARTITION BY parentId ORDER BY ID) first_element,
ROW_NUMBER()OVER(PARTITION BY parentId ORDER BY ID DESC) Last_element
FROM Child
), CTE2 AS
(
SELECT c1.id,c1.parentid,c1.letter,c2.parentid as c2parentid
FROM CTE c1
INNER JOIN CTE c2
ON c1.last_element = 1
AND c2.first_element = 1
AND c1.id +1 = c2.id
), CTE3 AS
(
SELECT C.parentid,C.id
FROM CTE2
INNER JOIN child C ON CTE2.c2parentid = C.parentid
AND C.letter = CTE2.letter
)
SELECT P.number, C.letter
FROM Child C
JOIN Parent P ON C.parentId = P.id
LEFT JOIN CTE3 ON CTE3.id = C.id
ORDER BY P.number, ISNULL(CTE3.id,0) DESC, C.letter
आउटपुट
number letter
1 A
1 C
2 C
2 B
3 B
3 D
संपादित करें
अगर आपके ids
अनुक्रमिक नहीं हैं, आप बदल सकते हैं CTE1
और CTE2
ROW_NUMBER()OVER(ORDER BY ID) seq_id
का उपयोग करने के लिए इस तरह ।
;WITH CTE AS
(
SELECT id,ParentID,letter,
ROW_NUMBER()OVER(ORDER BY ID) seq_id,
ROW_NUMBER()OVER(PARTITION BY parentId ORDER BY ID) first_element,
ROW_NUMBER()OVER(PARTITION BY parentId ORDER BY ID DESC) Last_element
FROM Child
), CTE2 AS
(
SELECT c1.id,c1.parentid,c1.letter,c2.parentid as c2parentid
FROM CTE c1
INNER JOIN CTE c2
ON c1.last_element = 1
AND c2.first_element = 1
AND c1.seq_id + 1 = c2.seq_id
)
बाकी कोड वही रहता है।