zoukankan      html  css  js  c++  java
  • 一条SQL语句求每月连续低温时间

    近期为某个项目写存储过程做统计。其中有个是这样的:

    求每个月至少连续3个小时低于某个温度值的时间(小时)。

    假设有个全年温度表:

    CREATE TABLE #t(m INT, h INT ,t DECIMAL(18,4));--m:月份 h:小时 t:温度值  
    --一年有8760小时,因此气候表里面有8760条记录,对应全年每小时的温度值  

    思路是这样的:

    1、先将低于指定温度的记录都找出来

    2、然后在这些记录中找出符合条件的,即那些属于至少连续3小时低于指定温度的记录


    至少连续3小时低于指定温度的记录有如下特征:

    比如说,有记录 h= 3、4、5、6、7,它们显然满足条件。

    m h t
    1 3 14
    1 4 12
    1 5 10
    1 6 12
    1 7 14

    1 9 12
    1 10 11
    1 13 13
    1 15 14

    对于 h=3,存在着 h+1,h+2 都低于指定温度

    对于 h=4、5、6,存在着 h-1,h+1 都低于指定温度

    对于 h=7,存在着 h-1,h-2 都低于指定温度

    只要满足这三项条件的任意一项,即可认为该时刻符合条件。因此可得SQL语句:

    WITH w AS(
    	SELECT [m],[h],[t]
    		FROM #t 
    		WHERE   [t] < 15 
    )
    SELECT 
    	m
    	,Free = COUNT(*)
    	 FROM w
    	 WHERE (EXISTS(SELECT 1 FROM w as w1 where m=w.m and h=w.h+1) AND EXISTS(SELECT 1 FROM w as w1 where m=w.m and h=w.h+2))
    		OR (EXISTS(SELECT 1 FROM w as w1 where m=w.m and h=w.h-1) AND EXISTS(SELECT 1 FROM w as w1 where m=w.m and h=w.h+1))
    		OR (EXISTS(SELECT 1 FROM w as w1 where m=w.m and h=w.h-1) AND EXISTS(SELECT 1 FROM w as w1 where m=w.m and h=w.h-2))
    	 GROUP BY m;


  • 相关阅读:
    [转]项目需求范围管理
    JavaScript 王者归来
    [转]大文件上传组件
    [转]使用vs2005自带的sql2005 express
    JS判断Caps Lock
    [转]Web项目管理思考
    [转]JS严格验证身份证
    两分钟用C#搭建IE BHO勾子, 窃取密码
    asp.net性能提升十个方法(Microsoft)
    [转]Asp.net 将js文件打包进dll 方法
  • 原文地址:https://www.cnblogs.com/leftfist/p/4257927.html
Copyright © 2011-2022 走看看