2

単純な2列のテーブルがあります。PctGainには、毎週の株式市場の上昇率が含まれています。WSeqkeyには、新しい週ごとに増分する連続した整数値が含まれています。上記の表には約3300行あります。これがサンプルです。

PctGain WSeqKey
0.12%   4407
0.31%   4406
0.68%   4405
1.14%   4404
0.95%   4403
0.38%   4402
4.57%   4401
-1.94%  4400
1.17%   4399
-0.32%  4398

解決し、その過程でどのように行うかを学ぶのに役立つのは...ポジティブシーケンスとネガティブシーケンスがいつ開始および終了するかを教えてくれるクエリを作成/実行することです。何かのようなもの

Negative Beg 4398
Negative End 4398
Positive Beg 4399
Positive End 4399
Negative Beg 4400
Negative End 4400
Positive Beg 4401
Positive End 4407

これを解決し、私が途中で学ぶのを手伝ってくれてありがとう。

フランク

4

2 に答える 2

2

このような何かが仕事をするはずですSQL Fiddle

Itzik Ben Gan の行番号手法を使用して、同じ値を持つシーケンシャル データのアイランドを見つけ、SIGNそれらに同じグループ化値を割り当ててから、それらをグループ化し、集計します。はCROSS APPLY ... VALUESピボットを解除しMINMAX

;WITH T1
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY SIGN(PctGain) 
                                       ORDER BY WSeqKey) - WSeqKey AS Grp
         FROM   YourTable),
     T2
     AS (SELECT MIN(WSeqKey)  AS BeginSeq,
                MAX(WSeqKey)  AS EndSeq,
                SIGN(PctGain) AS Sign
         FROM   T1
         GROUP  BY Grp,
                   SIGN(PctGain))
SELECT CASE Sign
         WHEN -1 THEN 'Negative'
         WHEN 0 THEN 'Equal'
         WHEN 1 THEN 'Positive'
       END AS [Sign],
       Descriptor,
       SeqKey
FROM   T2
       CROSS APPLY (VALUES('Begin', BeginSeq),
                          ('End',   EndSeq)) V(Descriptor, SeqKey)
ORDER  BY SeqKey 
于 2013-02-17T23:59:05.847 に答える
1

MSDN のギャップ/島の URL を見て、それを理解した皆さんに感謝します。

pctgain > 0 でフィルタリングしながら WSEQKEY のみを一時テーブル (#gaps) にダンプし、次の SQL を使用しました。

SELECT t1.gapID as startOfGroup, MIN(t2.gapID) 
as endOfGroup FROM (SELECT gapID FROM #gaps tbl1 
  WHERE NOT EXISTS(SELECT * FROM #gaps tbl2 
    WHERE tbl1.gapID - tbl2.gapID = 1)) t1
  INNER JOIN (SELECT gapID FROM #gaps tbl1 
  WHERE NOT EXISTS(SELECT * FROM #gaps tbl2 
    WHERE tbl2.gapID - tbl1.gapID = 1)) t2
  ON t1.gapID <= t2.gapID   GROUP BY t1.gapID
  order by t1.gapID desc
于 2013-02-18T02:57:09.837 に答える