从SQL Server 2008查询结果中选择每个第n行,其中表没有行标识列

时间:2013-01-18 21:11:53

标签: sql-server

我感觉如此接近......我认为我的问题是我如何使用MOD函数和ROW_NUMBER()函数,但我不明白我做错了什么。

我正在使用ROW_NUMBER()函数,因为我需要一种方法来选择每个“第n”行。我已经阅读了关于此的其他页面(我用它们来创建我的SQL)...但是我从SQL Server收到错误。我需要内部表连接(表Tick_OneMinH1H2的2个实例)来同时获取不同证券的价格快照。

如果我用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 个答案:

答案 0 :(得分:18)

您无法引用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;

另请注意Martin和Marc指出的内容 - SQL Server使用%而不是您从VB或其他地方引入的MOD运算符。