Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Ordenando as linhas pai por data decrescente com as linhas filhas ordenadas independentemente abaixo de cada


Assistindo as Olimpíadas -- apenas folheei sua postagem -- parece que você quer controlar a classificação em cada nível (raiz e um nível), e certifique-se de que os dados sejam retornados com os filhos diretamente abaixo de seu pai (para que você possa paginar o dados...). Nós fazemos isso o tempo todo. Você pode adicionar um order by para cada consulta interna e crie um sort coluna. Eu inventei um exemplo ligeiramente diferente que deve ser fácil para você aplicar à sua circunstância. Eu classifiquei a raiz ascendente e o nível um descendente apenas para ilustrar como você pode controlar cada parte.
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

Isso produz estes resultados:
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

Você pode ver que os nós raiz são classificados em ordem crescente e os nós internos são classificados em ordem decrescente.