2012-09-08 26 views
0

我需要一个sql server结果集来“破解”列值,但如果我在排列函数中按此列排序,我真正需要的顺序就会丢失。这个例子最好解释一下。我目前正在尝试的查询是:我是否需要为我需要的结果集使用可怕的sql服务器循环/游标?

select RANK() over(partition by Symbol, Period order by TradeDate desc) 
    SymbSmaOverUnderGroup, Symbol, TradeDate, Period, Value, Low, LowMinusVal, 
    LMVSign 
from #smasAndLow3 

,并返回:

Rnk Symbol TradeDate Period Value Low LowMinusVal LMVSign 
1 A  9/6/12 5  37.09 36.71 -.38  U 
2 A  9/5/12 5  37.03 36.62 -.41  U 
3 A  9/4/12 5  37.07 36.71 -.36  U 
4 A  8/31/12 5  37.15 37.30 .15  O 
5 A  8/30/12 5  37.22 37.40 .18  O 
6 A  8/29/12 5  37.00 36.00 -1.00  U 
7 A  8/28/12 5  37.10 37.00 -.10  U 

我需要这里的排名是:1,1,1,2,2,3,3。所以我需要通过Symbol,Period进行分区,并且我需要在LMVSign(它只包含值U,O和E)上启动一个新分区,但是必须由TradeDate desc命令。除非我弄错了,否则LMVSign的分区或排序会使日期列无法排序。我希望这是有道理的。我正在疯狂地做这个没有光标,但我无法得到它的工作..先谢谢了。

回答

5

UPDATE澄清后:我认为你正在进入岛屿和空白的世界。如果您的要求是按照Symbol对行进行分组,则TradeDate会下降订购Period和LMVSign,并在这些列中的任何一列发生更改时对其进行排名,您可以使用此(by Itzik Ben-Gan's solution to islands and gaps)。

; with islandsAndGaps as 
(
    select *, 
     -- Create groups. Important part is order by 
     -- The difference remains the same as two sequences 
     -- run along, but the number itself is not ordered 
     row_number() over (partition by Symbol, Period 
          order by TradeDate) 
     - row_number() over (partition by Symbol, Period 
          order by LMVSign, TradeDate) grp 
    from Table1 
), 
grouped as 
(
    select *, 
     -- So to order it we use last date in group 
     -- (mind partition by uses changed order by from second row_number 
     -- and unordered group number 
     max(TradeDate) over(partition by LMVSign, grp) DateGroup 
    from islandsAndGaps 
) 
-- now we can get rank 
select dense_rank() over (order by DateGroup desc) Rnk, 
     * 
    from grouped 
order by TradeDate desc 

Take a look at Sql Fiddle

OLD答案:

分区被重新排名。我认为你的需要顺序:

dense_rank() over (order by Symbol, Period, LMVSign desc) Rnk 

,然后你应该为了通过使用TradeDate:

order by Rnk, TradeDate desc 

如果你需要它作为一个数,另一列添加:

row_number() over (order by Symbol, Period, LMVSign desc, TradeDate desc) rn 
+0

Thx,但将所有具有相同值的LMVSigns组合在一起......表中只有三个唯一值。我在我的原始文章中添加了一些更多的例子。当LMVSigns更改(甚至已经遇到的值)时,我希望RANK()增加。 – StatsViaCsh

+0

@StatsViaCsh我已经更新了我的答案。 –

+0

@NikolaMarkovinović:+1好的答案 –

相关问题