Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengurutkan berdasarkan catatan berikutnya dan sebelumnya dalam SQL

Anda dapat melakukan sesuatu seperti ini.

  1. Identifikasi huruf pertama dan terakhir dari setiap induk dengan menggunakan ROW_NUMBER() dan PARTITION BY
  2. Cocokkan dengan record terakhir dari ids sebelumnya dengan catatan pertama dari ids berikutnya .
  3. Periksa apakah id induk kedua memiliki huruf yang cocok dengan huruf yang dipilih di atas
  4. Gunakan LEFT JOIN dan gunakan CASE atau ISNULL untuk menetapkan prioritas yang lebih tinggi untuk ids seperti itu catatan di mana surat itu cocok

Kueri

;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 

Keluaran

number  letter
1   A
1   C
2   C
2   B
3   B
3   D

SQL Fiddle

EDIT

Jika ids . Anda tidak berurutan, Anda dapat mengubah CTE1 dan CTE2 seperti ini untuk menggunakan 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
)

Kode lainnya tetap sama.

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. cara membuat dan memanggil fungsi skalar di sql server 2008

  2. Bagaimana cara berbagi database dengan TFS?

  3. Transpos kumpulan hasil SQL

  4. Beberapa kondisi dalam klausa WHERE

  5. Pisahkan Data di SQL Server String