sql >> Database teknologi >  >> RDS >> Sqlserver

Sortering baseret på næste og tidligere poster i SQL

Du kan gøre sådan noget.

  1. Identificer første og sidste bogstav for hver forælder ved at bruge ROW_NUMBER() og PARTITION BY
  2. Match den sidste post i det foregående id med den første post i det næste id .
  3. Tjek, om det andet overordnede id har et bogstav, der matcher det bogstav, der er valgt ovenfor.
  4. Brug en LEFT JOIN og brug CASE eller ISNULL at indstille en højere prioritet for et sådant id post, hvor bogstavet havde matchet

Forespørgsel

;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 

Output

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

SQL Fiddle

REDIGER

Hvis dine ids ikke er sekventielle, kan du ændre CTE1 og CTE2 sådan for at bruge 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
)

Resten af ​​koden forbliver den samme.

SQL Fiddle




  1. Hvordan får man tabelkommentarer via SQL i Oracle?

  2. loop en mysql-forespørgsel

  3. MySQL – FOUND_ROWS() Funktion for det samlede antal berørte rækker

  4. Tips til at reducere din SQL Server-kompleksitet