gpt4 book ai didi

SQL order by 需要检查 DATETIME2 是否不为 null 然后先返回它们,然后按 id 排序

转载 作者:行者123 更新时间:2023-12-02 00:49:33 27 4
gpt4 key购买 nike

我有两个表,但我很难弄清楚如何按语句进行排序以满足我的需要。基本上,如果 FeaturedUntil 列大于现在,则应按 PurchasedAt 列首先返回这些列。最近的购买应该排在第一位。在这些之后,所有内容都应按项目 Id 列降序排列。

创建表脚本

create table Items(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] nvarchar(200) null,
)

create table Feature(
[Id] [int] IDENTITY(1,1) NOT NULL,
[PurchasedAt] [datetime2](7) NOT NULL,
[FeaturedUntil] [datetime2](7) NOT NULL,
[ItemId] [int] NOT NULL,
)

插入脚本

insert into Items(Name) values ('test1')
insert into Feature(PurchasedAt, FeaturedUntil, ItemId) values (dateadd(day, -3, getdate()), dateadd(month, 1, getdate()), @@IDENTITY)
insert into Items(Name) values ('test2')
insert into Feature(PurchasedAt, FeaturedUntil, ItemId) values (dateadd(day, -2, getdate()), dateadd(month, 1, getdate()), @@IDENTITY)
insert into Items(Name) values ('test3')
insert into Feature(PurchasedAt, FeaturedUntil, ItemId) values (dateadd(day, -1, getdate()), dateadd(month, -1, getdate()), @@IDENTITY)
insert into Items(Name) values ('test4')

选择脚本

select * 
from Items i
left join Feature f on i.Id = f.ItemId
order by
case when f.FeaturedUntil is not null THEN f.PurchasedAt
else i.Id
end

select 应该首先返回 test2,因为它的 FeaturedUntil 大于现在并且它是最近购买的,第二行应该是 test1,因为它是在 test2 之前购买的。在这些之后应该是 test4,最后一个是 test3,因为它们没有加入 Feature 表数据或者 FeatureUntil 不大于现在,它们按它们的 排序Item.Id 降序。

最佳答案

SELECT *
FROM items i
LEFT JOIN feature f
ON i.id = f.itemid
ORDER BY CASE
WHEN f.featureduntil > getdate THEN purchasedat
ELSE '19000101'
END DESC,
id DESC

您需要按降序排列,以便最先获得最近购买的商品; ID 排序仍然会发生,因此如果您有两个相同的 PurchasedAt,它将按 ID 对这 2 个进行排序。

关于SQL order by 需要检查 DATETIME2 是否不为 null 然后先返回它们,然后按 id 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58860881/

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