2014-06-23 1 views
0

Я очень сильно обеспокоен моей последней проблемой. Вот как выглядят мои данныеСоздание row_number, которое начинается с подмножества данных

ID  Item  Price Rank 
    1  A   1.00  1 
    2  A   2.00  2 
    3  A   2.00  2 
    4  A   4.00  3 
    5  B   1.23  1 
    6  B   2.24  2 
    7  B   4.40  3 

Проблема заключается в том, когда есть «связь» (см строки ID = 2 и 3), я хочу, чтобы это было:

ID  Item  Price Rank 
    1  A   1.00  1 
    2  A   2.00  2 
    3  A   2.00  3 
    4  A   4.00  4 

Я знаю, что я мог бы сделать это действительно легко с помощью курсора, но я думаю, что это будет ужасно. Я попытался использовать функции окна, такие как LAG и Row_Number, но вы по-прежнему имеете дело с решениями по строке. И я не мог придумать способ пройти через и затем начать, когда вы перейдете к следующему пункту.

Может ли кто-нибудь подумать о лучшем способе борьбы с этим вместо курсора? К сожалению, исправление исходных данных на самом деле не является вариантом.

+0

Покажите нам Ваш запрос. Или ваш код. – Ryx5

ответ

0

Window Functions

Здесь вы должны использовать row_number() вместо dense_rank() or rank()

select ID,Item,Price,row_number() over(order by Item,Price) 
from Table1 
0

Ваш ищете как row_number() и partition by пункта:

select id, item, price, row_number() over (partition by item order by price, id) as rank 
from table t; 
0

Может быть, вы можете попробовать ниже запроса:

SELECT ID, ITEM, PRICE, 
ROW_NUMBER() OVER 
(
    PARTITION BY ITEM 
    ORDER BY PRICE, ID 
) AS RANK 
FROM MY_TABLE; 

Это поможет вам выход:

ID | Item | Price  |Rank 
1 | A  |  1.00 | 1 
2 | A  |  2.00 | 2 
3 | A  |  2.00 | 3 
4 | A  |  4.00 | 4 
5 | B  |  1.23 | 1 
6 | B  |  2.24 | 2 
7 | B  |  4.40 | 3 
0

Try,

In which OrderBy you want 


select id, item, price, Row_Number() over (partition by item order by price, id) as  Row_Number, 
    Dense_Rank() over (partition by item order by price, id) as Dense_Rank, 
    Rank() over (partition by item order by price, id) as Rank 
    from table YourTableName;