2013-01-18 12 views
10

Mi sento così vicino ... Penso che il mio problema è come sto usando la funzione MOD combinata con la funzione ROW_NUMBER(), ma non lo faccio capisco cosa sto sbagliandoSelezione di ogni ennesima riga da SQL Server 2008 risultato della query dove tabella non ha riga id riga

Sto usando la funzione ROW_NUMBER() perché ho bisogno di un modo per selezionare ogni "ennesima" riga. Ho letto le altre pagine su questo (li ho usati per creare il mio SQL) ... ma sto ricevendo un errore da SQL Server. Ho bisogno del join della tabella interna (2 istanze della tabella Tick_OneMin, H1 e H2) per ottenere i prezzi di diversi titoli allo stesso tempo.

Se io commento la linea con la funzione MOD ... SQL esegue bene ... ma se ho messo nel .... SQL Server genera il messaggio di errore:

Un'espressione di tipo non booleano specificato in un contesto in cui è prevista una condizione, vicino a "MOD".

Ecco il mio tentativo di 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 

Il mio tavolo è simile al seguente (1 tabella con 3 colonne)

Tabella 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 

e Voglio creare il seguente output

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

Qualche motivo per cui SQL SErver genera l'errore?

risposta

18

Non è possibile fare riferimento a un alias definito nella clausola SELECT nella clausola WHERE, poiché viene analizzato per primo WHERE. Una soluzione è quella di utilizzare una sottoquery o 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; 

Si noti anche che Martin e Marc hanno fatto notare - SQL Server utilizza % non il MOD operatore si sta portando in da VB o altrove.

+1

Inoltre: SQL Server utilizza l'operatore '%' - ** non ** a 'MOD' .... –

+0

@marc_s sì, grazie –

+0

Questo ha funzionato perfettamente ... grazie. – user1991508

Problemi correlati