如何在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

假设我有一个可以包含一个或多个值的结果集,但我始终只希望结果中有一个值,并且特定值比其他值更有价值

如何在sql中解决这个问题,以便在子查询中使用它

示例(特定于T-SQL,这是我使用的重音):

我有一张桌子:

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

“每日排名”确保周三和周四排在其他日期之前,然后您只需选择最前面的一天。

您可以删除您的答案并将该细节添加到问题本身,但将解决方案建议保留在答案部分似乎更正确。看起来还好吧?