Declare @tbl1MinENI Table (ID int identity, Simbolo char(3), DataOra datetime, Apertura numeric(15,4), Massimo numeric(15,4), Minimo numeric(15,4), Chiusura numeric(15,4), Volume int) Insert Into @tbl1MinENI ( Simbolo, DataOra, Apertura, Massimo, Minimo, Chiusura, Volume) Values ('ENI', '2010/10/18 09:00:00', 16.1100, 16.1800, 16.1100, 16.1400, 244015), ('ENI', '2010/10/18 09:01:00', 16.1400, 16.1400, 16.1300, 16.1400, 15692 ), ('ENI', '2010/10/18 09:02:00', 16.1400, 16.1500, 16.1400, 16.1500, 147035), ('ENI', '2010/10/18 09:03:00', 16.1500, 16.1600, 16.1500, 16.1600, 5181 ), ('ENI', '2010/10/18 09:04:00', 16.1600, 16.2000, 16.1600, 16.1900, 5134 ), ('ENI', '2010/10/18 09:05:00', 16.1900, 16.1900, 16.1800, 16.1800, 15040 ), ('ENI', '2010/10/18 09:06:00', 16.1900, 16.1900, 16.1600, 16.1600, 68867 ), ('ENI', '2010/10/18 09:07:00', 16.1600, 16.1600, 16.1600, 16.1600, 7606 ), ('ENI', '2010/10/18 09:08:00', 16.1500, 16.1500, 16.1500, 16.1500, 725 ), ('ENI', '2010/10/18 09:09:00', 16.1600, 16.1600, 16.1600, 16.1600, 81 ), ('ENI', '2010/10/18 09:10:00', 16.1700, 16.1800, 16.1700, 16.1700, 68594 ), ('ENI', '2010/10/18 09:11:00', 16.1800, 16.1800, 16.1800, 16.1800, 6619 ) Declare @nRowsPerGroup int = 3 ;With Prepare as ( Select datediff(minute, '2010/10/18 09:00:00', DataOra)/@nRowsPerGroup as Grp, Row_Number() over (partition by datediff(minute, '2010/10/18 09:00:00', DataOra)/@nRowsPerGroup order by dataora) as rn, * From tbl1MinENI ), b as ( Select a.Grp, Min(a.DataOra) as GroupDataOra, Min(ID) AperturaID, max(a.Massimo) as Massimo, Min(a.Minimo) as Minimo, max(id) ChiusuraID, sum(a.Volume) as Volume From Prepare a Group by Grp ) Select b.grp, b.GroupDataOra, ta.Apertura, b.Massimo, b.Minimo, tc.Chiusura, b.Volume From b Inner Join tbl1MinENI ta on ta.ID=b.AperturaID Inner Join tbl1MinENI tc on tc.ID=b.ChiusuraID ;
不简单的“分组依据” - 首先需要打开和关闭值,并且相应地在组中的最后一行。或者至少是外汇数据:)