Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Sortowanie na podstawie następnych i poprzednich rekordów w SQL

Możesz zrobić coś takiego.

  1. Zidentyfikuj pierwszą i ostatnią literę każdego rodzica za pomocą ROW_NUMBER() i PARTITION BY
  2. Dopasuj ostatni rekord poprzedniego id z pierwszym rekordem następnego id .
  3. Sprawdź, czy drugi identyfikator rodzica ma literę, która pasuje do litery wybranej powyżej
  4. Użyj LEFT JOIN i użyj CASE lub ISNULL aby ustawić wyższy priorytet dla takiego id zapis, w którym list pasował

Zapytanie

;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 

Wyjście

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

Skrzypce SQL

EDYTUJ

Jeśli Twoje ids nie są sekwencyjne, możesz zmienić CTE1 i CTE2 w ten sposób, aby wykorzystać 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
)

Reszta kodu pozostaje taka sama.

SQL Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy można ustawić domyślny schemat z ciągu połączenia?

  2. Zamień zduplikowane spacje na pojedynczą spację w T-SQL

  3. Jak łączyć ciągi i wartości NULL w SQL Server

  4. Jak naprawić stan oczekiwania na odzyskiwanie w bazie danych programu SQL Server?

  5. Połącz XML bez rzutowania typu na ciąg