10

とても身近に感じます...MOD関数を関数と組み合わせて使用​​する方法が問題だと思いますが、ROW_NUMBER()何が間違っているのかわかりません。

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

関数を使用して行をコメントアウトするとMOD...SQLは正常に実行されます...しかし、それを挿入すると....SQLServerはエラーメッセージをスローします。

'MOD'の近くで、条件が予期されるコンテキストで指定された非ブール型の式。

これが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

私のテーブルは次のようになります(3列の1つのテーブル)

テーブル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

次の出力を作成したい

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

SQL SErverがエラーをスローする理由はありますか?

4

1 に答える 1

18

は最初に解析されるため、句のSELECT句で定義されたエイリアスを参照することはできません。回避策の1つは、サブクエリまたはCTEを使用することです。WHEREWHERE

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;

MartinとMarcが指摘していることにも注意してください。SQLServerは、VBやその他の場所から持ち込んだ演算子を使用して%いません。MOD

于 2013-01-18T21:14:51.367 に答える