Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sắp xếp dựa trên các bản ghi tiếp theo và trước đó trong SQL

Bạn có thể làm điều gì đó như thế này.

  1. Xác định chữ cái đầu tiên và chữ cái cuối cùng của mỗi phụ huynh bằng cách sử dụng ROW_NUMBER()PARTITION BY
  2. Khớp bản ghi cuối cùng của id trước đó với bản ghi đầu tiên của id tiếp theo .
  3. Kiểm tra xem id gốc thứ hai có bất kỳ chữ cái nào khớp với chữ cái đã chọn ở trên không
  4. Sử dụng LEFT JOIN và sử dụng CASE hoặc ISNULL để đặt mức độ ưu tiên cao hơn cho một id như vậy ghi lại trong đó chữ cái đã khớp

Truy vấn

;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 

Đầu ra

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

SQL Fiddle

CHỈNH SỬA

Nếu id của bạn không tuần tự, bạn có thể thay đổi CTE1CTE2 như thế này để sử dụng 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
)

Phần còn lại của mã vẫn như cũ.

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. Máy chủ Sql không cập nhật hồ sơ

  2. Tạo tất cả các kết hợp trong SQL

  3. Trong SQL Server 2005, tôi có thể thực hiện xóa theo tầng mà không đặt thuộc tính trên bảng của mình không?

  4. Sql LEFT OUTER JOIN với mệnh đề WHERE

  5. Peta Poco mệnh đề where