Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Komplexe Sortierung basierend auf den nächsten und vorherigen Datensätzen in SQL

Wenn ich Ihre Anforderung richtig verstehe, haben Sie einige Teile von parentId und Sie möchten, dass jeder Teil mit dem letter beginnt s diese sind im vorherigen Teil und enden mit letter s diese sind im nächsten Teil, wenn ja, versuchen Sie dies:

;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