2013-08-10 3 views
0

Все еще изучая SQL и очень признателен за любую помощь или совет по этому вопросу. У меня есть таблица со столбцом значений и двумя столбцами ИД, которые указывают, к какой группе принадлежит эта строка, то есть:Ранг SQL с приоритетом

значение | GroupA | GroupB
12 | 1 | 0
16 | 1 | 0
19 | 0 | 1
11 | 1 | 0
30 | 0 | 1
16 | 0 | 1

Я хотел был бы заказать эту таблицу в порядке убывания, но присвоить приоритет ранжированию тем строкам с 1 в группе A, прежде чем оценивать те, что находятся в группе B. Результат должен выглядеть примерно так.

стоимость | GroupA | GroupB | Ранг
12 | 1 | 0 | 2
16 | 1 | 0 | 1
19 | 0 | 1 | 5
11 | 1 | 0 | 3
30 | 0 | 1 | 4
16 | 0 | 1 | 6

+3

Почему ваша таблица имеет два бита столбцы GroupA, GroupB, чтобы указать, к какой группе она принадлежит? Это должен быть столбец 'int' как внешний ключ таблицы' Group', а 'GroupA',' GroupB' должны быть именами каждой группы. –

+0

Являются ли обе группы взаимоисключающими? Ваши данные образца могут привести к тому, что один бит может указать, к какой группе относится значение: 1 = A, 0 = B. Могут ли быть дополнительные группы в будущем? Как они будут упорядочены, когда значение принадлежит нескольким группам? – HABO

+0

Группы взаимоисключающие. Однако в будущем может быть больше групп. Я не уверен, что буду следить за тем, почему я не должен хранить группу в столбцах бит. Вы предлагаете один столбец, определяющий, к какой группе принадлежит? –

ответ

0

Попробуйте

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

Я полностью согласен с TimSchmelter - вы не должны хранить группы в битовых столбцов. В текущей схеме запрос может выглядеть

select 
    Value, GroupA, GroupB, 
    row_number() over(order by GroupA desc, value desc) as [Rank] 
from Table1 

, но если у вас будет больше групп в будущем, вы должны написать дело внутри статьи по

sql fiddle example