2013-01-18 8 views
10

Czuję się tak blisko ... Myślę, że moim problemem jest to, w jaki sposób używam funkcji MOD w połączeniu z funkcją ROW_NUMBER(), ale ja nie nie rozumiem, co robię źle.Wybieranie każdego n-tego wiersza z wyniku zapytania SQL Server 2008, w którym tabela nie ma kolumny wiersza id

Używam funkcji ROW_NUMBER(), ponieważ potrzebuję sposobu na wybranie każdego wiersza "nth". Czytałem inne strony o tym (użyłem ich do utworzenia mojego SQL) ... ale dostaję błąd z SQL Server. Potrzebuję wewnętrznego stołu dołączyć (2 wystąpienia tabeli Tick_OneMin, H1 i H2), aby uzyskać ceny różnych papierów wartościowych w tym samym czasie migawki.

Gdybym wykomentuj linię z funkcją MOD ... SQL wykonuje w porządku ... ale jeśli mogę umieścić go w SQL Server .... wyrzuca komunikat o błędzie:

Wyrażenie typu nie-boolowskiego określonego w kontekście, w którym oczekiwany jest warunek, w pobliżu "MOD".

Oto moja próba na 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 

Moja tabela wygląda następująco (1 tabeli z 3 kolumny)

Tabela 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 

i Chcę utworzyć następujące wyjście:

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

Jakieś pomysły, dlaczego SQL SErver rzuca błąd?

Odpowiedz

18

Nie można odwoływać się do aliasu zdefiniowanego w klauzuli SELECT w klauzuli WHERE, ponieważ najpierw analizowana jest WHERE. Jednym rozwiązaniem jest użycie podzapytania lub 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; 

Należy również zauważyć, co Martin i Marc podkreśliło - SQL Server używa % nie operatora MOD jesteś przynosząc z VB lub gdzie indziej.

+1

Ponadto: SQL Server używa operatora '%' - ** nie ** funkcji 'MOD' ... –

+0

@ marc_s tak, dzięki –

+0

To działało idealnie ... dzięki. – user1991508

Powiązane problemy