Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selecting every nth row from SQL Server 2008 query result where table does not have row id column

Tags:

sql-server

I feel so close... I think my problem is how I'm using the MOD function combined with the ROW_NUMBER() function, but I don't understand what I'm doing wrong.

I'm using the ROW_NUMBER() function because I need a way to select every "nth" row. I've read the other pages about this (I used them to create my SQL)...but I'm getting an error from SQL Server. I need the inner table join (2 instances of the table Tick_OneMin, H1 and H2) to get prices of different securities at the same time snapshot.

If I comment out the line with the MOD function...the SQL executes fine...but if I put it in....SQL Server throws the error message:

An expression of non-boolean type specified in a context where a condition is expected, near 'MOD'.

Here is my attempt at the 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

My table looks like the following (1 table with 3 columns)

Table 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

and I want to create the following output

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

Any ideas why SQL SErver is throwing the error?

like image 209
user1991508 Avatar asked Jan 18 '13 21:01

user1991508


People also ask

How do you fetch records that are present in one table but not in another table?

How to Select All Records from One Table That Do Not Exist in Another Table in SQL? We can get the records in one table that doesn't exist in another table by using NOT IN or NOT EXISTS with the subqueries including the other table in the subqueries.

How do I select every nth row in SQL?

Here's the SQL query to select every nth row in MySQL. mysql> select * from table_name where table_name.id mod n = 0; In the above query, we basically select every row whose id mod n value evaluates to zero.

How do you display the 9th record from an EMP table?

SELECT * FROM Employee; Now let's display the Nth record of the table. Syntax : SELECT * FROM <table_name> LIMIT N-1,1; Here N refers to the row which is to be retrieved.

How do I get only the specific number of rows in SQL?

The SQL SELECT TOP Clause The SELECT TOP clause is used to specify the number of records to return. The SELECT TOP clause is useful on large tables with thousands of records. Returning a large number of records can impact performance.


1 Answers

You can't reference an alias defined in the SELECT clause in the WHERE clause, since WHERE is parsed first. One workaround is to use a subquery or 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;

Note also what Martin and Marc have pointed out - SQL Server uses % not the MOD operator you're bringing in from VB or elsewhere.

like image 139
Aaron Bertrand Avatar answered Oct 05 '22 07:10

Aaron Bertrand