按日期降序对父行进行排序,子行在每行下方独立排序

2023-12-25

这是我的表架构的一个人为版本,用于说明我的问题:

报价 ID、详细信息、创建日期、模型报价 ID

其中 QuoteID 是主键,ModelQuoteID 是返回到该表的可为空的外键,用于表示根据另一个报价建模的报价(并且可能随后更改了其“详细信息”列等)。

我需要返回按 DateCreated 降序排序的报价列表,但建模报价除外,建模报价应位于其父报价下方,按任何其他同级报价内的日期降序排序(报价只能建模一层深度)。

例如,如果我有这 4 个引号行:

1, 'Fix the roof', '01/01/2012', null
2, 'Clean the drains', '02/02/2012', null
3, 'Fix the roof and door', '03/03/2012', 1
4, 'Fix the roof, door and window', '04/04/2012', 1
5, 'Mow the lawn', '05/05/2012', null

然后我需要按以下顺序返回结果:

5 - Mow the lawn
2 - Clean the drains
1 - Fix the roof
4 - -> Fix the roof, door and window
3 - -> Fix the roof and door

我还传递了搜索条件,例如“详细信息”的关键字,并且我返回了建模引号,即使它们不包含搜索词但其父引号包含搜索词。我已经使用公共表表达式来获取原始报价,并与建模报价的联接联合起来,使该部分工作。

这很好用,但目前我必须将建模的引号重新排列成代码中的正确顺序。这并不理想,因为我的下一步是在 SQL 中实现分页,如果当时行没有正确分组,那么我将不会让当前页面中的子项在代码中进行重新排序。一般来说,无论如何它们都会自然地组合在一起,但并非总是如此。您今天可以为一个月前的报价创建一个模型报价。

我在这方面花了很多时间,有 SQL 专家可以帮忙吗?非常感激。

编辑:这是我的 SQL 的一个人为版本,以适合我的人为示例:-)

;with originals as (
select
    q.*
from
    Quote q
where
    Details like @details
)
select
    *
from
(
select
    o.*
from
    originals o

union

select
    q2.*
from
    Quote q2
join
    originals o on q2.ModelQuoteID = o.QuoteID
)
as combined

order by
    combined.CreatedDate desc

观看奥运会 - 刚刚浏览了您的帖子 - 看起来您想要控制每个级别(根和一级)的排序,并确保返回数据时子级直接位于其父级下方(这样您就可以分页数据...)。我们一直这样做。您可以添加一个order by每个内部查询并创建一个sort柱子。我设计了一个稍微不同的示例,您应该可以轻松地将其应用于您的情况。我对根升序和一级降序进行排序只是为了说明如何控制每个部分。

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

这会产生以下结果:

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

您可以看到根节点按升序排序,内部节点按降序排序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按日期降序对父行进行排序,子行在每行下方独立排序 的相关文章

随机推荐