SQL Query用于计算一个月的峰值/非峰值总计

时间:2014-11-19 21:45:32

标签: sql sql-server sql-server-2008

有人可以帮助我使用SQL查询来计算一个月的总峰值和关闭值,以及该月的最大/最高峰值/非峰值小时值。

我每天将计量表的每小时值存储在SQL表中。

On-Peak

  • 夏季:工作日4月至10月(7-22)(M-F)
  • 冬季:工作日的11月至3月(8-23)(M-F)

非高峰

  • 夏季:4月至10月(0-6,23,24);周末(周六和周日);这几个月的所有公众假期都被视为非高峰期
  • 冬季:11月至3月(0-7,24);周末(周六和周日);这几个月的所有公众假期都被视为非高峰期

这是数据库表结构:

HourId         - Uniqueidentifier
CustomerName   - nvarchar(50)
Readingdate    - datetime
IntegratedHour - TinyInt
Load           - decimal(18,4)
Generation     - Decimal (18,4)
LastModified   - Datetime
ModifiedBy     - nvarchar(50)

1 个答案:

答案 0 :(得分:1)

以下是代码,解释如下:

declare @start_date date = '1 Feb 2014'
declare @end_date date = '31 Jul 2014'

with ReadingsMonth as
(
  select *, month(ReadingDate) as [month] from readings r
  where ReadingDate between @start_date and @end_date
)
, ReadingMonthPeak as
(
  select r.[month], r.[load], 
    case
      when h.[date] is not null then 0  -- holiday
      when datepart(dw, r.ReadingDate) in (1,7) then 0  -- weekend
      when (r.[month] between 4 and 10) and (IntegratedHour < 7 or IntegratedHour > 22) then 0 -- summer
      when (r.[month] < 4 or r.[month] > 10) and (IntegratedHour < 8) then 0 -- winter
      else 1
    end as onpeak
  from ReadingsMonth r
  left join holidays h on h.[date] = r.ReadingDate
)
select [month], [onpeak], sum([load]) as TotalLoad, max([load]) as MaxLoad
from ReadingMonthPeak
group by [month], [onpeak]
order by [month], [onpeak]

第一次CTE只是增加月份。第二个根据您的规则计算开/关高峰时间。请注意,您需要一个包含所有假日日期的表格。在最终选择中,您只需按月分组和开/关峰值标记。看看小提琴:http://www.sqlfiddle.com/#!3/a87240/5/0