SQL优先级排序

SQL优先级排序,sql,sql-server-2008,Sql,Sql Server 2008,仍在学习SQL,非常感谢在此方面的任何帮助或建议。我有一个表,其中有一个值列和两个ID列,用于指定该行所属的组,即: 值|组A |组B 12 | 1 | 0 16 | 1 | 0 19 | 0 | 1 11 | 1 | 0 30|0|1 16 | 0 | 1 我想对这个表按降序排序,但在对组B中的行进行排序之前,先对组a中有1的行进行排序。输出应该如下所示 值|组A |组B |等级 12 | 1 | 0 | 2 16 | 1 | 0 | 1 19 | 0 | 1 | 5 11 | 1 | 0 |

仍在学习SQL,非常感谢在此方面的任何帮助或建议。我有一个表,其中有一个值列和两个ID列,用于指定该行所属的组,即:

值|组A |组B
12 | 1 | 0
16 | 1 | 0
19 | 0 | 1
11 | 1 | 0
30|0|1
16 | 0 | 1

我想对这个表按降序排序,但在对组B中的行进行排序之前,先对组a中有1的行进行排序。输出应该如下所示

值|组A |组B |等级
12 | 1 | 0 | 2
16 | 1 | 0 | 1
19 | 0 | 1 | 5
11 | 1 | 0 | 3
30 | 0 | 1 | 4
16 | 0 | 1 | 6

试试这个

select *,Row_number() OVER(ORDER BY groupA*100+value desc ) as Rank
from Ranks
order by groupA desc,value desc

我完全同意TimSchmelter的观点——你们不应该将组存储在位列中。在当前模式中,查询可能如下所示

select
    Value, GroupA, GroupB,
    row_number() over(order by GroupA desc, value desc) as [Rank]
from Table1
但是如果将来有更多的组,就必须在over子句中写case


为什么您的表有两个位列GroupA、GroupB来指示它所属的组?这应该是
int
列,作为
Group
表的外键,
GroupA
GroupB
应该是每个组的名称。这两个组是互斥的吗?您的示例数据可能会让人相信,单个位可以指示a值属于哪个组:1=a,0=B。将来还会有其他组吗?当一个值属于多个组时,它们将如何排序?这些组是互斥的。不过,将来可能会有更多的团体。我不确定我是否明白为什么不应该将组存储在位列中。您是否建议使用一列来标识它所属的组?如果
只能属于一个组,则按照Tim Schmelter的建议,使用单个列可以避免意外选择多个组。它允许轻松添加新组,并且可以编制索引。如果每个
值必须分配给一个组,则不允许
NULL
s。(提示:要回复特定用户,请以@和他们的姓名开始您的评论,例如
@HABO
。您的评论将通知他们。)