Sql为big select中的一列选择第一个值

时间:2015-12-04 14:25:12

标签: sql sql-server select

我有这个选择

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!

由于

1 个答案:

答案 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;