2010-08-16 34 views
1

我有北京時間,DT,[打開],用於輸入表SQL最大的前面行

Dt is yyyy-mm-dd 

我想返回的每一行,其中股票=「IBM」,並返回北京時間,申卷, [打開],卷字段,然後在前面的x天僅包含一個最大列。爲了不發佈太多數據,我們假設3天。

但我不知道如何獲得正確的時間框架,以便最多隻能包含在這麼多天後。

表:

Tck Dt   [Open]  Volume 
IBM 2010-05-21 122.160000 6881000 
IBM 2010-05-24 125.260000 6876000 
IBM 2010-05-25 121.470000 9498800 
IBM 2010-05-26 124.890000 9085900 
IBM 2010-05-27 125.050000 7726500 

我需要什麼:

Tck Dt   [Open]  Volume Max 
IBM 2010-05-21 122.160000 6881000 122.160000 
IBM 2010-05-24 125.260000 6876000 125.260000 
IBM 2010-05-25 121.470000 9498800 125.260000 
IBM 2010-05-26 124.890000 9085900 125.260000 
IBM 2010-05-27 125.050000 7726500 125.050000 

這裏是我當前的SQL,但明顯不羣的最大值正確。

Select Ticker, 
     Dt, 
     [Open], 
     Volume, 
     (Select Max([Open]) from Daily_NYSE 
      where Ticker = 'IBM' 
      and Dt between DateAdd(Day,-3,'2010-05-27') and '2010-05-27') as 'Max' 
from Daily_NYSE 
where Ticker = 'IBM' 
and Dt between DateAdd(Day,-6,'2010-05-27') and '2010-05-27' 

謝謝! Adam

+1

對於什麼RDBMS?看起來SQL Servery,但是什麼版本?還有3個交易日還是3個日曆日? – 2010-08-16 22:01:49

+0

MS SQL Server 2008R2。 3個日曆天。 – user422224 2010-08-16 22:05:14

+0

我想我是不正確的,我正在尋找市場日子,而不是日曆天:>) – user422224 2010-08-16 22:27:47

回答

2

你的意思是這樣的嗎?

編輯工作過近3個交易日

SELECT * INTO #stocks FROM 
(
SELECT 'IBM' AS Ticker, CAST('2010-05-21' AS DATE) AS dt, 122.160000 AS [OPEN] ,12639500 AS Volume UNION ALL 
SELECT 'IBM' AS Ticker, CAST('2010-05-24' AS DATE), 125.260000 AS [OPEN] ,6876000 AS Volume UNION ALL 
SELECT 'IBM' AS Ticker, CAST('2010-05-25' AS DATE), 121.470000 AS [OPEN] ,9498800 AS Volume UNION ALL 
SELECT 'IBM' AS Ticker, CAST('2010-05-26' AS DATE), 124.890000 AS [OPEN] ,9085900 AS Volume UNION ALL 
SELECT 'IBM' AS Ticker, CAST('2010-05-27' AS DATE), 125.050000 AS [OPEN] ,7726500 AS Volume 
) X 

;WITH NumberedStocks AS 
(
SELECT Ticker, dt, [Open], Volume, 
    ROW_NUMBER() OVER (PARTITION BY Ticker ORDER BY dt) AS rn 
FROM #stocks 
) 
SELECT ns1.Ticker, ns1.dt, ns1.[Open], ns1.Volume, MAX(ns2.[Open]) AS MaxPrev3 
FROM NumberedStocks ns1 LEFT JOIN NumberedStocks ns2 
ON ns1.Ticker = ns2.Ticker AND ns2.rn 
    BETWEEN ns1.rn-3 AND ns1.rn-1 /*Or should this be ns1.rn-2 AND ns1.rn?*/ 
GROUP BY ns1.Ticker, ns1.dt, ns1.[Open], ns1.Volume 
+1

+1。在需要上一天* n *天處理那些日子/空白時,很容易使用CTE。 – 2010-08-16 22:32:17

0

我想我只是回答了我的問題:

Select a.Ticker, 
     a.Dt, 
     a.[Open], 
     a.Volume, 
     (Select Max([Open]) from Daily_NYSE b 
      where Ticker = 'IBM' 
      and b.Dt between DateAdd(Day,-2,a.Dt) and a.Dt) as 'Max' 
from Daily_NYSE a 
where Ticker = 'IBM' 
and a.Dt between DateAdd(Day,-12,'2010-05-27') and '2010-05-27' 
0

看起來你想你的Max是相對於3天給定日期的前一天? 如果不是,請評論。

DECLARE @SomeDate smalldatetime  
SELECT @SomeDate = '2010-05-27' 

SELECT Ticker, 
     Dt, 
     [Open], 
     Volume, 
     (SELECT Max([Open]) 
      FROM Daily_NYSE AS D2 
      WHERE D2.Ticker = 'IBM' 
      AND D2.Dt BETWEEN DateAdd(Day,-3,D1.Dt) AND D1.Dt 
     ) AS 'Max' 
FROM Daily_NYSE AS D1 
WHERE Ticker = 'IBM' 
AND  Dt BETWEEN DateAdd(Day,-6,@SomeDate) AND @SomeDate 
+0

謝謝p.campbell,我相信我們都提出了相同的答案,我只有最後一次減少數據量。這是我正在尋找的東西! – user422224 2010-08-16 22:20:40

+0

我認爲我錯了,我正在尋找市場日,而不是日曆日:>) – user422224 2010-08-16 22:25:27

+0

@user - 查看我的編輯。 – 2010-08-16 22:28:48