sql >> Databáze >  >> RDS >> Sqlserver

Řazení na základě dalších a předchozích záznamů v SQL

Můžete udělat něco takového.

  1. Identifikujte první a poslední písmeno každého rodiče pomocí ROW_NUMBER() a PARTITION BY
  2. Odpovídá poslednímu záznamu předchozího ids s prvním záznamem dalšího ids .
  3. Zkontrolujte, zda má id druhého rodiče nějaké písmeno, které se shoduje s písmenem vybraným výše
  4. Použijte LEFT JOIN a použijte CASE nebo ISNULL nastavit vyšší prioritu pro takové ids záznam, ve kterém se písmeno shodovalo

Dotaz

;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 

Výstup

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

SQL Fiddle

UPRAVIT

Pokud vaše ids nejsou sekvenční, můžete změnit CTE1 a CTE2 takto použít 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
)

Zbytek kódu zůstává stejný.

SQL Fiddle




  1. Jak zvýším rychlost této analýzy dat?

  2. vyberte * z table_name kde sloupec jako ' '

  3. vyplňte zaškrtávací políčka a poté aktualizujte výběr na mysql

  4. Jak provést objednávku bez ohledu na velikost písmen v Rails pomocí postgresql