如何在SQL中创建结果集的常规排名?
假设我有一个可以包含一个或多个值的结果集,但我始终只希望结果中有一个值,并且特定值比其他值更有价值 如何在sql中解决这个问题,以便在子查询中使用它 示例(特定于T-SQL,这是我使用的重音): 我有一张桌子:如何在SQL中创建结果集的常规排名?,sql,tsql,Sql,Tsql,假设我有一个可以包含一个或多个值的结果集,但我始终只希望结果中有一个值,并且特定值比其他值更有价值 如何在sql中解决这个问题,以便在子查询中使用它 示例(特定于T-SQL,这是我使用的重音): 我有一张桌子: tChore(ChoreId int primary key, ChoreDescription nvarchar(15)) 里面有各种各样的杂务。我还有一张桌子: tDayChores( DayId int primary key, ChoreId int forei
tChore(ChoreId int primary key, ChoreDescription nvarchar(15))
里面有各种各样的杂务。我还有一张桌子:
tDayChores(
DayId int primary key,
ChoreId int foreign key references tChore(ChoreId)
)
在一个多对多的关系中,它承载着许多天和家务
当然,还有第三个表包含了所有星期的名称
现在,让我们假设我想得到一个,而且只有一天,真空。我更喜欢在星期三做,但如果没有安排,那么我想在星期四做。反过来,如果没有安排,那没关系,任何一天都可以
将结果集限制为一行的一种方法是:
select top(1)
DayId
from
tDayChores DC
inner join tChore C
on C.ChoreId = DC.ChoreId
where
C.ChoreDescription = 'vacuum'
但是,如果真空被安排在周一和周三,那么我会得到周一,我想把周三排在最前面。下面是一个使用子查询的解决方案:
select top(1)
t.DayId
from (
select
DayId,
case
when DayId = 3 then 1 -- DayId: 3 = Wednesday
when DayId = 4 then 2 -- DayId: 4 = Thursday
else 3
end DayRank
from
tDayChores DC
inner join tChore C
on C.ChoreId = DC.ChoreId
where
C.ChoreDescription = 'vacuum'
) t
order by t.DayRank
“每日排名”确保周三和周四排在其他日期之前,然后您只需选择最前面的一天。您可以删除您的答案并将该细节添加到问题本身,但将解决方案建议保留在答案部分似乎更正确。看起来还好吧?