sql >> Databasteknik >  >> RDS >> Sqlserver

Komplex sortering baserad på nästa och tidigare poster i SQL

Om jag förstår ditt krav rätt har du vissa delar av parentId och du vill att varje del ska börja med letter s de finns i föregående del och slutar med letter Om de är i nästa del, Om ja, prova detta:

;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. Räknas högre rader i mysql explain betyder bra eller dåligt?

  2. Ställa in klasssökväg för en lagrad Java-procedur i Oracle

  3. Relationell algebra

  4. Hur man skriver parameteriserad sql-fråga för att förhindra SQL-injektion?