SQL查询在某个值之间花费的时间

时间:2016-04-20 09:19:43

标签: sql-server date common-table-expression

我有一个过去10年所有温度的数据库。 现在我想找到温度高于ex的所有时期。 15度。

Simplified example:
...
2015-05-10  12 
2015-05-11  15 |
2015-05-12  16 |
2015-05-13  17 |
2015-05-14  16 |
2015-05-15  15 |
2015-05-16  12
2015-05-17  11
2015-05-18  15 |
2015-05-19  12
2015-05-20  18 |
...

现在我希望得到这样的所有时间段:

Min         Max
2015-05-11  2015-05-15
2015-05-18  2015-05-18
2015-05-20  2015-05-20

有关此查询的外观的任何建议吗?

2 个答案:

答案 0 :(得分:1)

您可以使用CTE

CREATE TABLE #Date (DateT datetime, Value int )

INSERT INTO #Date 
VALUES ('2015-05-10',12), 
       ('2015-05-11',15), 
       ('2015-05-12',16), 
       ('2015-05-13',17), 
       ('2015-05-14',16), 
       ('2015-05-15',15), 
       ('2015-05-16',12), 
       ('2015-05-17',11), 
       ('2015-05-18',15), 
       ('2015-05-19',12), 
       ('2015-05-20',18)



WITH t AS (
          SELECT  DateT d,ROW_NUMBER() OVER(ORDER BY DateT) i
          FROM #Date
          WHERE Value >= 15
          GROUP BY DateT
        )


SELECT MIN(d) as DataStart,MAX(d) as DataFinal, ROW_NUMBER() OVER(ORDER BY DATEDIFF(day,i,d)) as RN
FROM t
GROUP BY DATEDIFF(day,i,d)

RN列是可选的,您可以使用

 SELECT MIN(d) as DataStart,MAX(d) as DataFinal 
 FROM t
 GROUP BY DATEDIFF(day,i,d)

答案 1 :(得分:0)

这是使用间隙和岛算法的解决方案。它看起来有点笨重,但运行速度快,规模很大。它也是模块化的,如果你想添加一个允许间隙的参数,你可以将它重写为其他列的分区,它仍然可以很好地运行。

Peter Larssons的灵感来自http://www.sqltopia.com/?page_id=83

$ for fmt in yuyv422 uyvy422 yuv420p yuva420p10; do /tmp/test $fmt; done
N planes: 3, 8 bits/element
Plane 0 has 2.000000 elements/y_pixel (horizontally) and 1.000000 lines/y_pixel (vertically)
N planes: 3, 8 bits/element
Plane 0 has 2.000000 elements/y_pixel (horizontally) and 1.000000 lines/y_pixel (vertically)
N planes: 3, 8 bits/element
Plane 0 has 1.000000 elements/y_pixel (horizontally) and 1.000000 lines/y_pixel (vertically)
Plane 1 has 0.500000 elements/y_pixel (horizontally) and 0.500000 lines/y_pixel (vertically)
Plane 2 has 0.500000 elements/y_pixel (horizontally) and 0.500000 lines/y_pixel (vertically)
N planes: 4, 10 bits/element
Plane 0 has 1.000000 elements/y_pixel (horizontally) and 1.000000 lines/y_pixel (vertically)
Plane 1 has 0.500000 elements/y_pixel (horizontally) and 0.500000 lines/y_pixel (vertically)
Plane 2 has 0.500000 elements/y_pixel (horizontally) and 0.500000 lines/y_pixel (vertically)
Plane 3 has 1.000000 elements/y_pixel (horizontally) and 1.000000 lines/y_pixel (vertically)