2014-02-06 7 views
0

Наверное, лучше я объясню, что я после того, как с примером :)SQL генерировать последовательные идентификаторы на основе другого столбца (ов)

Say У меня есть следующая таблица

SELECT * 
INTO #OrderRanking 
FROM (
    SELECT 'Jim', 1000 
    UNION ALL 
    SELECT 'Jim', 500 
    UNION ALL 
    SELECT 'Jim', 500 
    UNION ALL 
    SELECT 'Jim', 3000 
    UNION ALL 
    SELECT 'Bob', 1000 
    UNION ALL 
    SELECT 'Bob', 2000 
    UNION ALL 
    SELECT 'Bob', 500 
    UNION ALL 
    SELECT 'Bob', 500 
    UNION ALL 
    SELECT 'Fred', 500 
) AS t(Customer, OrderTotal) 

То, что я хочу это следующий результат в SELECT заявлении

Customer, OrderTotal, CustomerId 
'Jim', 1000, 1 
'Jim', 500, 1 
'Jim', 500, 1 
'Jim', 3000, 1 
'Bob', 1000, 2 
'Bob', 2000, 2 
'Bob', 500, 2 
'Bob', 500, 2 
'Fred', 500, 3 

Мой фактический запрос является немного более сложным, где исходные столбцы больше чем 2.

+0

Нужно ли 'Jim' быть' 1' или просто хотите, чтобы у клиентов с тем же именем был одинаковый идентификатор? – Taryn

+0

Нет, он не должен быть таким. Достаточно уникального идентификатора. – Umair

ответ

2

Я олух,

SELECT *, DENSE_RANK() OVER(ORDER BY Customer DESC) 
FROM #OrderRanking 

Я думаю, что это должно охватывать все случаи!

1
select customer, ordertotal, dense_rank() over(order by total desc, customer asc) 
from (select *, sum(ordertotal) over(partition by customer) total from #orderranking) t 
+1

Интересный подход! Однако, если у двух клиентов одинаковая сумма, тогда она будет генерировать тот же идентификатор – Umair

+0

Извините, я думал, что вы хотите, чтобы клиент с более полными заказами был первым в рейтинге. Если вам просто нужны разные номера для разных клиентов, то сделанный вами sql будет делать; в противном случае, если бы вы хотели, чтобы оба условия (рейтинг по общему количеству и разные номера клиентов), я отредактировал запрос, чтобы удовлетворить его. – Jayvee

Смежные вопросы