2014-06-23 24 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

嘗試,

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;