【发布时间】:2020-03-10 15:41:41
【问题描述】:
我有两张桌子,我无法弄清楚如何按语句进行排序以满足我的需要。
基本上,如果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降序排列的。
【问题讨论】:
标签: sql sql-server