我有这个选择
declare @maxDate datetime;
declare @nextDate datetime;
declare @count int;
set maxDate = (select dateadd(minute, datediff(minute, 0, max(Date)), 0)
from Trader7].[dbo].[tblTick]);
set @nextDate = DATEADD(minute, 1, @maxDate);
set @count = select count(*)
from [Trader7].[dbo].[ntbMin]
where Time=cast(cast(@maxDate as atetime) as float));
select
tblInstrument.ID,
MIN(cast(cast(Date as datetime) as float)) as [Time],
MIN(tblTick.[Open]),
MAX(tblTick.[High]),
MIN(tblTick.[Low]),
MAX(tblTick.[Close]),
MAX(tblTick.Volume), 0
from
[Trader7].[dbo].[tblTick]
left join
tblInstrument on tblInstrument.EdpSymbol = [tblTick].Symbol
where
blTick.[Date] between @maxDate and @nextDate
group by
tblInstrument.ID
--cast(cast(Date as datetime) as float)
--,tblTick.[Open],tblTick.[High],tblTick.Low],tblTick.[Close],tblTick.Volumeorder by 1
如何获取tblTick.[Open]
的第一列值以及tblTick.[Close]
的最后一个值,而不是min和max!
由于
答案 0 :(得分:2)
不幸的是,SQL Server不支持first_value()
和last_value()
的聚合函数。幸运的是,您可以使用窗口函数和条件聚合来实现相同的目的。例如:
select it.ID,
MIN(cast(cast(Date as datetime) as float)) as [Time],
MIN(it.[Open]),
MAX(it.[High]),
MIN(it.[Low]),
MAX(it.[Close]),
MAX(it.Volume), 0,
MAX(case when seqnum_asc = 1 then it.open end) as first_open,
MAX(case when seqnum_desc = 1 then it.close end) as last_close
from (select i.*, t.*, -- you should probably list the columns here individually
row_number() over (partition by i.id order by date) as seqnum_asc,
row_number() over (partition by i.id order by date desc) as seqnum_dec
from [Trader7].[dbo].[tblTick] t left join
tblInstrument i
on i.EdpSymbol = t.Symbol
where t.[Date] between @maxDate and @nextDate
) it
group by i.ID;