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

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

Nếu tôi hiểu đúng yêu cầu của bạn, bạn có một số phần của parentId và bạn muốn mỗi phần bắt đầu bằng letter những cái đó ở phần trước Và kết thúc bằng letter Đó là những phần tiếp theo, Nếu có, hãy thử phần này:

;WITH t AS (
    SELECT 
        c.id, 
        c.parentId,
        c.letter,
        dt.parentSeq
    FROM 
        Child c 
        JOIN (
        SELECT 
            ci.parentId, ROW_NUMBER() OVER (ORDER BY p.number) parentSeq
        FROM 
            Child ci
            JOIN
            Parent p ON ci.parentId = p.id
        GROUP BY
            ci.parentId, p.number) dt ON c.parentId = dt.parentId
)
SELECT
    p.number,
    t.letter
FROM 
    t
    JOIN
    Parent p ON t.parentId = p.id
ORDER BY
    p.number,
    CASE WHEN t.letter IN (SELECT ti.letter FROM t ti WHERE ti.parentSeq = t.parentSeq - 1) THEN 0 
        WHEN t.letter IN (SELECT ti.letter FROM t ti WHERE ti.parentSeq = t.parentSeq + 1) THEN 2 
        ELSE 1 END,
    t.letter


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SET QUOTED IDENTIFIER phải được BẬT khi chèn bản ghi

  2. Cách tốt nhất để nội suy các giá trị trong SQL

  3. Thoát tham số lệnh được chuyển tới xp_cmdshell đến dtexec

  4. Sử dụng Collate trong CONCAT

  5. Truy vấn SQL để tạo ma trận như bảng liên quan truy vấn đầu ra trong SQL Server