Выбор каждой n-й строки из результата запроса SQL Server 2008, где таблица не имеет столбца столбца строки

Я чувствую себя так близко... Я думаю, что моя проблема в том, как я использую функцию MOD в сочетании с функцией ROW_NUMBER(), но я не понимаю, что я делаю неправильно.

Я использую функцию ROW_NUMBER(), потому что мне нужен способ выбрать каждую строку "nth". Я прочитал другие страницы об этом (я использовал их для создания моего SQL)... но я получаю сообщение об ошибке от SQL Server. Мне нужно включить внутреннее соединение таблицы (2 экземпляра таблицы Tick_OneMin, H1 и H2), чтобы одновременно получать цены на разные ценные бумаги.

Если я прокомментирую строку с помощью функции MOD... SQL выполняет отлично... но если я ее помещу... SQL Server выдает сообщение об ошибке:

Выражение небулевого типа, указанное в контексте, где ожидается условие, рядом с "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

Моя таблица выглядит следующим образом (1 таблица с 3 столбцами)

Таблица 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 выбрасывает ошибку?

Ответ 1

Вы не можете ссылаться на псевдоним, определенный в предложении SELECT в предложении WHERE, поскольку сначала выполняется синтаксический анализ WHERE. Одним из способов является использование подзапроса или CTE:

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;

Обратите внимание также на то, что Мартин и Марк указали - SQL Server использует % не оператор MOD, который вы приносите из VB или где-либо еще.