SQL Server: Obtenir OHLC dans une requête avec n recodrs

J'ai besoin des valeurs OHLC d'une requête

SELECT [Open] -- first row value ,[High] -- max(High) ,[Low] -- min(low) ,[Close]-- last row value FROM [Forex] where Symbol ='EURUSD' and [timestamp] between '2013-07-18 01:00:00.000' and '2013-07-18 02:00:00.000' 

et je veux que cette requête a 12 heures de détails. Je veux dire que je dois get 12 loggings avec des valeurs horaires OHLC

Quelqu'un peut-il aider dans la requête. Comment récupérer le premier et le dernier logging d'un logging groupé dans une requête MySQL avec des fonctions d'agrégation? a une implémentation en MYSQL, j'ai besoin de SQL Server

Edit: Structure de la table

 CREATE TABLE [dbo].[Forex]( [Id] [bigint] IDENTITY(1,1) NOT NULL, [Symbol] [varchar](100) NOT NULL, [TimeStamp] [datetime] NOT NULL, [Bid] [decimal](18, 5) NOT NULL, [Ask] [decimal](18, 5) NOT NULL, [Open] [decimal](18, 5) NOT NULL, [High] [decimal](18, 5) NOT NULL, [Low] [decimal](18, 5) NOT NULL, [NetChange] [decimal](18, 5) NOT NULL, [PerChange] [decimal](18, 5) NOT NULL, CONSTRAINT [PK_Forex] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] 

et Index

 CREATE NONCLUSTERED INDEX [index_Forex_29_85575343__K2_K1] ON [dbo].[Forex] ( [Symbol] ASC, [Id] DESC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

vous pouvez utiliser quelque chose comme

 select [open],[min], [max], [close] from ( select min(value) [min], max(value) [max] from forex where Symbol ='EURUSD' and [timestamp] between '2013-07-18 01:00:00.000' and '2013-07-18 02:00:00.000' ) minmax, ( select top 1 value as [open] from forex where Symbol ='EURUSD' and [timestamp] between '2013-07-18 01:00:00.000' and '2013-07-18 02:00:00.000' order by [timestamp] ) fst, ( select top 1 value [close] from forex where Symbol ='EURUSD' and [timestamp] between '2013-07-18 01:00:00.000' and '2013-07-18 02:00:00.000' order by [timestamp] desc ) lst 

voir http://sqlfiddle.com/#!3/0547c/2

MODIFIER

Basé sur la question révisée … nous pouvons prendre les ID min et max groupés par période (heure) avec les valeurs min et max pour cette heure:

 select datepart(hh,timestamp) [hour], min(value) [min], max(value) [max], min(id) min_id, max(id) max_id from forex where Symbol ='EURUSD' and [timestamp] between '2013-07-18 01:00:00.000' and '2013-07-18 13:00:00.000' group by datepart(hh,timestamp) 

et joignez-le à la table forex (deux fois) pour get les valeurs d'ouverture et de fermeture.

Donner quelque chose comme

  select minmax.[hour], f_min.value [open], [min], [max], f_max.value [close] from (select datepart(hh,timestamp) [hour], min(value) [min], max(value) [max], min(id) min_id, max(id) max_id from forex where Symbol ='EURUSD' and [timestamp] between '2013-07-18 01:00:00.000' and '2013-07-18 13:00:00.000' group by datepart(hh,timestamp) ) minmax join forex f_min on min_id = f_min.id join forex f_max on max_id = f_max.id 

sqlfiddle

Cela m'a aidé

 select minmax.[hour], f_min.[Open] [open], [min], [max], f_max.Ask [close] from (select datepart(hh,timestamp) [hour], min(High) [min], max(Low) [max], min(id) min_id, max(id) max_id from forex where Symbol ='EURUSD' and [timestamp] between '2013-07-18 01:00:00.000' and '2013-07-18 15:00:00.000' group by datepart(hh,timestamp) ) minmax join forex f_min on min_id = f_min.id join forex f_max on max_id = f_max.id order by [hour]