2013-01-18 15 views
10

Kendimi çok yakın hissediyorum ... Sorunum, MOD işlevini ROW_NUMBER() işleviyle birlikte kullanıyorum ama bence Neyi yanlış yaptığımı anlamıyorum.SQL Server 2008 sorgu sonucundan her nth satırı seçerek tablonun satır kimliği sütununa sahip olmadığı

ROW_NUMBER() işlevini kullanıyorum çünkü her "nth" satırı seçmenin bir yoluna ihtiyacım var. Bununla ilgili diğer sayfaları okudum (SQL'i oluşturmak için kullandım) ... ama SQL Server'dan bir hata alıyorum. Aynı anda farklı menkul kıymetlerin fiyatını almak için iç tablo birleştirmesine (Tick_OneMin, H1 ve H2 tablosunun 2 örneği) ihtiyacım var.

Ben MOD fonksiyonu ile satırını açıklama olursa ... SQL ince yürütür ... ama ben .... SQL koyarsanız Sunucu hata mesajı atar:

bir ifade 'MOD' yakınında bir koşulun beklendiği bir bağlamda belirtilen boolean olmayan türden. İşte

SQL-- benim girişimi My tabloda aşağıdaki (1 3 sütunlu bir tablo)

Tablo 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 

ve benziyor

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 

Aşağıdaki çıktıyı oluşturmak istiyorum

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

SQL SErver bu hatayı neden attığına dair bir fikriniz var mı?

cevap

18

WHERE ilk olarak ayrıştırıldığından, WHERE deyimindeki SELECT maddesinde tanımlanan bir takma ada sahip olamazsınız. SQL Server % değil MOD operatör başka bir yerde VB veya gelen getiriyorlar kullanır - Martin ve Marc işaret ne de

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; 

Not: Bir geçici çözüm bir alt sorgu veya CTE kullanmaktır.

+1

Ayrıca: SQL Server '%' işleç - ** değil ** MOD 'işlevini kullanır .... –

+0

@marc_s evet, teşekkürler –

+0

Bu, mükemmel çalıştı ... teşekkürler. – user1991508