sql >> Database >  >> RDS >> Sqlserver

Sorteren op volgende en vorige records in SQL

Je kunt zoiets doen.

  1. Identificeer de eerste en laatste letter van elke ouder met behulp van ROW_NUMBER() en PARTITION BY
  2. Overeenkomen met de laatste record van de voorgaande id met de eerste record van de volgende id .
  3. Controleer of het tweede ouder-ID een letter bevat die overeenkomt met de hierboven geselecteerde letter
  4. Gebruik een LEFT JOIN en gebruik CASE of ISNULL om een ​​hogere prioriteit in te stellen voor zo'n id record waarin de letter overeenkwam

Zoekopdracht

;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 

Uitvoer

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

SQL Fiddle

BEWERKEN

Als uw ids niet opeenvolgend zijn, kunt u CTE1 change wijzigen en CTE2 zoals dit om ROW_NUMBER()OVER(ORDER BY ID) seq_id te gebruiken .

;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
)

Rest van de code blijft hetzelfde.

SQL Fiddle




  1. MySQL-fout 2013

  2. PHP zegt Geen database geselecteerd, zelfs niet na gebruik van mysqli_select_db()

  3. Wat is een schema in SQL Server en hoe maak je een schema in SQL Server-database? - SQL Server / TSQL-zelfstudie, deel 27

  4. Hiërarchische zoekopdrachten