2013-01-18 18 views
10

私は近づいていると感じています...私の問題は、MOD関数をROW_NUMBER()関数と組み合わせて使用​​していますが、私が間違っていることを理解していない。テーブルに行ID列がないSQL Server 2008のクエリ結果からn番目の行を選択

私はすべての「n番目」の行を選択する方法が必要なので、ROW_NUMBER()関数を使用しています。私はこれについての他のページを読んでいます(SQLを作成するために使用しました)...しかし、SQL Serverからエラーが発生しています。私は同時にテーブルスナップショットで異なる証券の価格を取得するには、内部テーブルの結合(テーブルTick_OneMinH1H2)の2つのインスタンスが必要です。

私はMOD機能を持つ行をコメントアウトした場合... SQLは罰金実行...しかし、私はそれを置けば.... SQL Serverはエラーメッセージをスロー:

表現条件が期待される文脈で指定された非ブール型の「MOD」の近くにある。ここで

Tick_OneMin

Ticker - CombDateTime - Close_PX 
------------------------------------ 
ES  - 1/3/2012 10:00 AM - 1470 
ZN  - 1/3/2012 10:00 AM - 132.5 
ES  - 1/3/2012 10:01 AM - 1475 
ZN  - 1/3/2012 10:01 AM - 133 

私のテーブルには、次の(3列を持つ1台)のように見えますSQL--

SELECT 
    ROW_NUMBER() OVER (ORDER BY H1.CombDateTime ASC) AS RowID, 
    H1.CombDateTime, 
    H1.Close_PX as 'TYA_Close', 
    H2.Close_PX 'ESA_Close' 
FROM 
    Tick_OneMin as H1, Tick_OneMin as H2 
WHERE 
    H1.Ticker = 'TYA' 
    AND H2.Ticker = 'ESA' 
    AND H1.CombDateTime >= '12/28/2012 10:00 AM' 
    AND H1.CombDateTime <= '12/28/2012 10:30 AM' 
    AND H1.CombDateTime = H2.CombDateTime 
    AND RowID MOD 4 = 0  
    -- this "RowID MOD 4 = 0" is throwing an error in SQL Server 
ORDER BY 
    H1.CombDateTime ASC 

での私の試みで、次の出力を作成したい。

Date - ZN.Price - ES.Price 
====  ======== ======== 
1/3/2012 - 132.5 - 1470 
1/3/2012 - 133 - 1475 

なぜSQL SErverがエラーをスローしているのですか?

答えて

18

WHEREが最初に解析されるため、WHERE句のSELECT句で定義されたエイリアスを参照することはできません。 SQL Serverは、他の場所VBかから持っている%ないMOD演算子を使用しています - マーティンとマルクが指摘しているものも

WITH x AS 
(
SELECT ROW_NUMBER() OVER (ORDER BY H1.CombDateTime ASC) AS RowID, 
    ... rest of query 
) 
SELECT CombDateTime, TYA_Close, ESA_Close --, RowID 
FROM x 
WHERE RowID % 4 = 0 
ORDER BY CombDateTime; 

注:回避策の一つは、サブクエリまたはCTEを使用することです。

+1

また、SQL Serverは '%'演算子 - **ではなく 'MOD'関数を使用します.... –

+0

@marc_sはい、ありがとう –

+0

これは完璧に機能しました...ありがとうございます。 – user1991508

関連する問題