Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Сортиране въз основа на следващ и предишен запис в SQL

Можете да направите нещо подобно.

  1. Идентифицирайте първата и последната буква на всеки родител с помощта на ROW_NUMBER() и PARTITION BY
  2. Съвпада с последния запис на предходния ids с първия запис на следващия ids .
  3. Проверете дали вторият родителски идентификатор има някаква буква, която съвпада с буквата, избрана по-горе
  4. Използвайте LEFT JOIN и използвайте CASE или ISNULL за да зададете по-висок приоритет за такъв ids запис, в който буквата е съвпаднала

Заявка

;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 

Изход

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

SQL Fiddle

РЕДАКТИРАНЕ

Ако вашите ids не са последователни, можете да промените CTE1 и CTE2 като това, за да използвате 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
)

Останалата част от кода остава същата.

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. SQL Server ANSI_NULLS Обяснено

  2. Как да извикам съхранена процедура с аргументи, използвайки sqlcmd.exe?

  3. Намиране на едновременни събития в база данни между времена

  4. Импортирайте избрани колони от CSV файлове в таблица на SQL Server

  5. Връщане на броя на редовете, засегнати от операторите UPDATE