上一行的SQL max
我有输入表的Ticker,Dt,[Open],Volume上一行的SQL max,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我有输入表的Ticker,Dt,[Open],Volume Dt is yyyy-mm-dd 我想返回ticker='IBM'的每一行,还返回ticker,Dt,[Open],Volume字段,然后包括一个max列,仅用于前x天。为了不发布太多数据,我们假设3天 但我不知道如何得到正确的时间框架,以便最大值只包含在这么多天之前 在表中: Tck Dt [Open] Volume IBM 2010-05-21 122.160000 6881000 IB
Dt is yyyy-mm-dd
我想返回ticker='IBM'的每一行,还返回ticker,Dt,[Open],Volume字段,然后包括一个max列,仅用于前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'
谢谢!
亚当你是说像这样吗
编辑以结束最后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
我想我刚刚回答了我自己的问题:
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'
看起来您希望您的
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
什么是RDBMS?看起来像SQL Server,但什么版本?还有3个交易日或3个日历日?MS SQL Server 2008R2。3个日历日。我想我是错的,我在寻找市场日,而不是日历日:>)谢谢你p.坎贝尔,我相信我们都得出了相同的答案,我有最后一个日期只是为了减少数据量。这正是我要找的!我想我是错的,我在寻找市场日,而不是日历日:>)+1。在处理前n天需要的天数/间隔时,使用CTE很容易。