如何实现求连续3小时最大累计值的记录

--如何实现求连续3小时最大累计值的记录:
GO
CREATE TABLE [dbo].[TB_RUNDATA](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [STCD] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [TM] [datetime] NOT NULL,
    [Z] [decimal](9, 3) NOT NULL,
 CONSTRAINT [PK_TB_RUNDATA] PRIMARY KEY CLUSTERED
(
    [STCD] ASC,
    [TM] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

SET IDENTITY_INSERT [dbo].[TB_RUNDATA] on

Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(7, 'ST101', '2009-10-24 00:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(8, 'ST101', '2009-10-24 01:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(9, 'ST101', '2009-10-24 02:00:00', 2.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(10, 'ST101', '2009-10-24 03:00:00', 3.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(11, 'ST101', '2009-10-24 04:00:00', 5.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(12, 'ST101', '2009-10-24 05:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(13, 'ST101', '2009-10-24 06:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(14, 'ST101', '2009-10-24 07:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(15, 'ST101', '2009-10-24 08:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(16, 'ST101', '2009-10-24 09:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(17, 'ST101', '2009-10-24 10:00:00', 34.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(18, 'ST101', '2009-10-24 11:00:00', 5.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(19, 'ST101', '2009-10-24 12:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(1, 'ST101', '2009-10-24 13:00:00', 11.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(5, 'ST101', '2009-10-24 14:00:00', 31.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(3, 'ST101', '2009-10-24 15:00:00', 30.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(20, 'ST101', '2009-10-24 16:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(21, 'ST101', '2009-10-24 17:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(22, 'ST101', '2009-10-24 18:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(23, 'ST101', '2009-10-24 19:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(24, 'ST101', '2009-10-24 20:00:00', 12.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(25, 'ST101', '2009-10-24 21:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(26, 'ST101', '2009-10-24 22:00:00', 0.000);
Insert TB_RUNDATA ([ID], [STCD], [TM], [Z]) Values(27, 'ST101', '2009-10-24 23:00:00', 0.000);

select row_number()over(order by TM asc) as num,* from [dbo].[TB_RUNDATA]



 select *from [dbo].[TB_RUNDATA]

drop table TB_RUNDATA


----求连续3小时最大累计值的记录
declare @mintime int
select @mintime=min(datepart(hh,TM)) from [TB_RUNDATA]
print @mintime





--方法一:

;with T
as
(
    select *,num=row_number() over (partition by [STCD] order by [TM])
    from [TB_RUNDATA]
),
M as
(
    select a.*
    from T a join T b on a.STCD = b.STCD and b.num = a.num + 1 and datediff(hh,a.TM,b.TM) = 1
    union
    select a.*
    from T a join T b on a.STCD = b.STCD and a.num = b.num + 1 and datediff(hh,b.TM,a.TM) = 1
),
N as
(
    select a.STCD,a.num,a.Z+b.Z+c.Z Z
    from M a join M b on a.STCD = b.STCD and a.num + 1 = b.num
        join M c on a.STCD = c.STCD and a.num + 2 = c.num
)

select a.*
from M a join N b on a.STCD = b.STCD and a.num between b.num and b.num + 2
where not exists (select 1 from N where STCD = b.STCD and Z > b.Z)


--方法二:

SELECT * FROM TB_RUNDATA a
    INNER JOIN (
    SELECT * from
      (
        SELECT *,(SELECT SUM(z) FROM tb_rundata b WHERE b.Tm BETWEEN a.tm
        AND dateadd(hh,2,a.tm)) sumb
        from TB_RUNDATA a
        )b
     WHERE NOT EXISTS (
                SELECT *
                from TB_RUNDATA a WHERE b.sumb < (SELECT SUM(z) FROM tb_rundata b
                WHERE b.Tm BETWEEN a.tm AND dateadd(hh,2,a.tm))
        )) b ON a.Tm BETWEEN b.tm AND dateadd(hh,2,b.tm)
        
/*
ID    STCD    TM    Z    num
5    ST101    2009-10-24 14:00:00.000    31.000    15
3    ST101    2009-10-24 15:00:00.000    30.000    16
1    ST101    2009-10-24 13:00:00.000    11.000    14

*/


自己写的一种方法


if OBJECT_ID('test')is not null
drop table test
go
create table test(
dates date,
value int
)
go
insert test
select '2012-01-01',2 union all
select '2012-01-02',3 union all
select '2012-01-03',2 union all
select '2012-01-04',7 union all
select '2012-01-05',6 union all
select '2012-01-07',3 union all
select '2012-01-09',5 union all
select '2012-01-10',6 union all
select '2012-01-11',8 union all
select '2012-01-13',4 union all
select '2012-01-14',9 union all
select '2012-01-15',4 union all
select '2012-01-16',1 union all
select '2012-01-18',2
go 


;with t
as(
select 
dateadd(dd,-ROW_NUMBER()over(order by dates asc),dates) as px,
* from test
),m
as(
select id=ROW_NUMBER()over(partition by px order by dates asc),
px,dates,value from t where px in(
select px from(
select px,
min(dates) as startdate,MAX(dates) as enddate
from t a group by px)a where datediff(dd,a.startdate,a.enddate)>=2)
),
g as(
select px,dates,
(select SUM(value) from m s 
where s.id between a.id-2 and a.id and a.px=s.px) as totals from m a
where exists(select 1 from m b where a.px=b.px and b.dates=DATEADD(DD,-2,a.dates))
)
select top 3 dates,totals from g
order by totals desc


/*
dates totals
---------------------------
2012-01-11 19
2012-01-15 17
2012-01-05 15
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值