gpt4 book ai didi

sql - 按日期降序排列父行,子行在每个行下独立排序

转载 作者:行者123 更新时间:2023-12-04 21:44:42 26 4
gpt4 key购买 nike

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

QuoteID、详细信息、DateCreated、ModelQuoteID

其中 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

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

效果很好,但目前我必须将建模引号重新排列为代码中的正确顺序。这并不理想,因为我的下一步是在 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

可以看到根节点是升序排列的,内部节点是降序排列的。

关于sql - 按日期降序排列父行,子行在每个行下独立排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11857295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com