0

列の値で「壊れる」SQL Server の結果セットが必要ですが、ランキング関数でこの列で並べ替えると、本当に必要な順序が失われます。これは、例によって最もよく説明されています。私が現在実験しているクエリは次のとおりです。

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 によるパーティション化または順序付けにより、日付列での並べ替えができなくなります。これが理にかなっていることを願っています。私はカーソルなしでこれを行うために狂ったように働いていますが、それを機能させることはできません..事前に感謝します。

4

1 に答える 1

5

明確化後の更新: 島とギャップの世界に入っていると思います。要件が、Symbol、Period、LMVSign で行をグループ化し、TradeDate で降順に並べ替え、これらの列のいずれかが変更されたときにランク付けする必要がある場合は、これを使用できます ( Itzik Ben-Gan の 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

Sql Fiddle を見てください

古い答え:

Partition by ランキングを再開します。次の順序で注文する必要があると思います。

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
于 2012-09-08T00:26:55.853 に答える