Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL में अगले और पिछले रिकॉर्ड के आधार पर छँटाई

आप ऐसा कुछ कर सकते हैं।

  1. ROW_NUMBER() का उपयोग करके प्रत्येक अभिभावक के पहले और अंतिम अक्षर की पहचान करें और PARTITION BY
  2. पिछले ids के पिछले रिकॉर्ड का मिलान करें अगले ids . के पहले रिकॉर्ड के साथ .
  3. जांचें कि क्या दूसरी पैरेंट आईडी में कोई अक्षर है जो ऊपर चुने गए अक्षर से मेल खाता है
  4. एक 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

SQL Fiddle

संपादित करें

अगर आपके 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
)

बाकी कोड वही रहता है।

SQL Fiddle




  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 सर्वर में PAGEIOLATCH_SH प्रतीक्षा प्रकार क्या है?

  2. SQL सर्वर:मैं एकाधिक पंक्ति मानों को अलग-अलग कॉलम में कैसे समूहित कर सकता हूं?

  3. पूरी तरह से तीसरे मान पर समूहीकृत करते हुए किसी अन्य मान के योग के आधार पर एक अद्वितीय मान के लिए क्वेरी करना

  4. sys.dm_os_host_info गतिशील प्रबंधन दृश्य के साथ SQL सर्वर में ऑपरेटिंग सिस्टम संस्करण जानकारी लौटाएं

  5. SQL सर्वर में पदानुक्रमित संबंधों को एक साथ कैसे समूहित करें