Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Sortieren der übergeordneten Zeilen nach Datum absteigend, wobei die untergeordneten Zeilen unabhängig voneinander angeordnet sind

Wenn Sie sich die Olympischen Spiele ansehen - Ihren Beitrag nur überflogen haben - sieht es so aus, als ob Sie die Sortierung auf jeder Ebene (Stamm und eine Ebene darunter) steuern und sicherstellen möchten, dass die Daten mit den untergeordneten Elementen direkt unter den übergeordneten Elementen zurückgegeben werden (damit Sie die Daten...). Wir machen das die ganze Zeit. Sie können eine order by hinzufügen zu jeder inneren Abfrage und erstellen Sie eine sort Säule. Ich habe mir ein etwas anderes Beispiel ausgedacht, das Sie leicht auf Ihre Umstände anwenden können. Ich habe die Wurzel aufsteigend und die Ebene eins absteigend sortiert, nur um zu veranschaulichen, wie Sie jeden Teil steuern können.

declare @tbl table (id int, parent int, name varchar(10))

insert into @tbl (id, parent, name)
values (1, null, 'def'), (2, 1, 'this'), (3, 1, 'is'), (4, 1, 'a'), (5, 1, 'test'),
       (6, null, 'abc'), (7, 6, 'this'), (8, 6, 'is'), (9, 6, 'another'), (10, 6, 'test')

;with cte (id, parent, name, sort) as (
  select id, parent, name, cast(right('0000' + cast(row_number() over (order by name) as varchar(4)), 4) as varchar(1024))
  from   @tbl
  where  parent is null

  union all

  select t.id, t.parent, t.name, cast(cte.sort + right('0000' + cast(row_number() over (order by t.name desc) as varchar(4)), 4) as varchar(1024))
  from   @tbl t inner join cte on t.parent = cte.id
)
select * from cte
order by sort

Dies führt zu diesen Ergebnissen:

id    parent    name     sort
----  --------  -------  ----------
6     NULL      abc      0001
7     6         this     00010001
10    6         test     00010002
8     6         is       00010003
9     6         another  00010004
1     NULL      def      0002
2     1         this     00020001
5     1         test     00020002
3     1         is       00020003
4     1         a        00020004

Sie können sehen, dass die Wurzelknoten aufsteigend und die inneren Knoten absteigend sortiert sind.