Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server获得第一名&;构成聚合的最后一行_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

SQL Server获得第一名&;构成聚合的最后一行

SQL Server获得第一名&;构成聚合的最后一行,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个表,它存储了一分钟内价格变动的数据。每条记录包含最后一分钟的开放、高、低、关闭和音量 CREATE TABLE TimeBar ( Instrument varchar(20), BarTimeStamp datetimeoffset(7), Open decimal(18, 5), High decimal(18, 5), Low decimal(18, 5), Close decimal(18, 5), Volume int ) 我试图做的是创建一个查询

我有一个表,它存储了一分钟内价格变动的数据。每条记录包含最后一分钟的开放、高、低、关闭和音量

CREATE TABLE TimeBar (
  Instrument varchar(20),
  BarTimeStamp datetimeoffset(7),
  Open decimal(18, 5),
  High decimal(18, 5),
  Low decimal(18, 5),
  Close decimal(18, 5),
  Volume int
)
我试图做的是创建一个查询,在这里我可以将数据聚合到更高的时间框架中,例如,我希望能够显示每小时的开放、高、低和关闭

以下是我目前的问题,我已经设法得到了高点和低点,但你如何得到开盘和收盘

  SELECT MIN(BarTimeStamp) AS TimeStamp,
         MAX(High) AS High,
         MIN(Low) AS Low,
         SUM(Volume) AS Volume
    FROM TimeBar
   WHERE Instrument = 'XYZ'
GROUP BY DATEPART(YEAR, BarTimeStamp), DATEPART(MONTH, BarTimeStamp), DATEPART(DAY, BarTimeStamp), DATEPART(HOUR, BarTimeStamp)

使用主查询作为子查询,为每个记录获取最小时间戳和最大时间戳,因此,为它们获取各自的开盘价和收盘价

SELECT x.*, TI.Open, TE.Close
FROM
(
SELECT   Instrument,
         MIN(BarTimeStamp) AS TimeStampIni,
         MAX(BarTimeStamp) AS TimeStampEnd,
         MAX(High) AS High,
         MIN(Low) AS Low,
         SUM(Volume) AS Volume
    FROM TimeBar
GROUP BY Instrument, DATEPART(YEAR, BarTimeStamp), DATEPART(MONTH, BarTimeStamp), DATEPART(DAY, BarTimeStamp), DATEPART(HOUR, BarTimeStamp)
) x
inner join TimeBar TI on ti.Instrument = x.Instrument AND TI.BarTimeStamp = x.TimeStampIni
inner join TimeBar Te on te.Instrument = x.Instrument AND Te.BarTimeStamp = x.TimeStampEnd

首先要做的是按时间范围分组:

SELECT MIN(BarTimeStamp) AS StartTimeStamp,
         MAX(BarTimeStamp) AS EndTimeStamp
    FROM #TimeBar
   WHERE Instrument = 'TEST'
GROUP BY DATEPART(YEAR, BarTimeStamp), DATEPART(MONTH, BarTimeStamp), DATEPART(DAY,       BarTimeStamp), DATEPART(HOUR, BarTimeStamp)
之后,问题是:

  • 进行连接以获取范围
  • 做一个连接来开始
  • 正在进行连接以获取最小值
  • 按原始范围分组以选择所有内容
我喜欢使用常用的表表达式来简化:

;WITH times as (
    SELECT MIN(BarTimeStamp) AS StartTimeStamp,
             MAX(BarTimeStamp) AS EndTimeStamp
        FROM #TimeBar
       WHERE Instrument = 'TEST'
    GROUP BY DATEPART(YEAR, BarTimeStamp), DATEPART(MONTH, BarTimeStamp), DATEPART(DAY, BarTimeStamp), DATEPART(HOUR, BarTimeStamp)
)
SELECT 
    StartTimeStamp as TimeStamp
    ,MIN([first].[Open]) as [Open]
    ,MAX(ranged.High) as High
    ,MAX(ranged.Low) as Low
    ,MIN([last].[Close]) as [Close]
    ,SUM(ranged.Volume) as Volume
FROM times 
INNER JOIN #TimeBar ranged ON times.StartTimeStamp <= ranged.BarTimeStamp AND times.EndTimeStamp >= ranged.BarTimeStamp
INNER JOIN #TimeBar [first] ON times.StartTimeStamp = [first].BarTimeStamp 
INNER JOIN #TimeBar [last] ON times.EndTimeStamp = [last].BarTimeStamp 
GROUP BY [times].StartTimeStamp
结果是:

TimeStamp                          Open                                    High                                    Low                                     Close                                   Volume
---------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- -----------
2011-11-21 01:00:00.0000000 +00:00 5.00000                                 7.00000                                 4.00000                                 4.00000                                 200
2011-11-21 02:10:00.0000000 +00:00 15.00000                                16.00000                                17.00000                                20.00000                                300
注意,我使用了一个临时表,只需将#TimeBar更改为TimeBar即可将其更改为真实表



另外,我不喜欢将
instrurmentvarchar
视为字段定义。您应该为此使用一个

谢谢,正是我想要的。
TimeStamp                          Open                                    High                                    Low                                     Close                                   Volume
---------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- -----------
2011-11-21 01:00:00.0000000 +00:00 5.00000                                 7.00000                                 4.00000                                 4.00000                                 200
2011-11-21 02:10:00.0000000 +00:00 15.00000                                16.00000                                17.00000                                20.00000                                300