SQL查询每15分钟比较一次值,并显示每小时的结果

时间:2013-06-27 15:33:11

标签: sql tsql ssms

我有一个包含2列的表格。 UTCTime和值。 UTCTime增量为15分钟。我想要一个查询,将一小时范围内的值与之前的值进行比较,并显示0到4之间的值,具体取决于值是否为常量。换句话说,每增加15分钟就有一个条目,值可以保持不变,所以我只需要检查每小时每个小时的值。

例如

+---------|-------+
| UTCTime | Value |
------------------|
|   12:00 |  18.2 |
|   12:15 |  87.3 |
|   12:30 | 55.91 |
|   12:45 | 55.91 |
|    1:00 |  37.3 |
|    1:15 |  47.3 |
|    1:30 |  47.3 |
|    1:45 |  47.3 |
|    2:00 |  37.3 |
+---------|-------+

在这种情况下,我只想要一个查询,将12:45的值与12:30和12:30到12:15进行比较,依此类推。由于我们只在一小时的时间内进行比较,因此常数值必须介于0和4之间(O没有常数值,1就像上面的例子中那样)

查询应显示:

+----------+----------------+
| UTCTime  | ConstantValues |
----------------------------|
| 12:00    | 1              |
|  1:00    | 2              |
+----------|----------------+

我只想提一下我是SQL编程的新手。 谢谢。

请参阅SQL小提琴here

3 个答案:

答案 0 :(得分:1)

以下是您需要的查询和working solution注意:我将时间范围更改为24小时

       ;with SourceData(HourTime, Value, RowNum)
  as
  (
    select 
      datepart(hh, UTCTime) HourTime, 
      Value, 
      row_number() over (partition by datepart(hh, UTCTime) order by UTCTime) RowNum
    from foo
    union 
    select 
        datepart(hh, UTCTime) - 1 HourTime, 
        Value,
        5
    from foo
    where datepart(mi, UTCTime) = 0
  )
  select cast(A.HourTime as varchar) + ':00' UTCTime, sum(case when A.Value = B.Value then 1 else 0 end) ConstantValues
  from SourceData A
   inner join SourceData B on A.HourTime = B.HourTime and
                           (B.RowNum = (A.RowNum - 1))
  group by cast(A.HourTime as varchar) + ':00'

答案 1 :(得分:0)

select SUBSTRING_INDEX(UTCTime,':',1) as time,value, count(*)-1 as total
from foo group by value,time having total >= 1;

fiddle

答案 2 :(得分:0)

我和Vasanth没什么不同,同样的想法是不同的方法。

这个想法是你需要递归来简单地执行它。您还可以使用LEAD()函数查看当前行前面的行,但在这种情况下,需要一个大的case语句来涵盖每个结果。

;WITH T
AS (
        SELECT a.UTCTime,b.VALUE,ROW_NUMBER() OVER(PARTITION BY a.UTCTime ORDER BY b.UTCTime DESC)'RowRank'
        FROM (SELECT * 
              FROM  #Table1 
              WHERE DATEPART(MINUTE,UTCTime) = 0
              )a
        JOIN #Table1 b
           ON b.UTCTIME BETWEEN a.UTCTIME AND DATEADD(hour,1,a.UTCTIME)
   )
 SELECT T.UTCTime, SUM(CASE WHEN T.Value = T2.Value THEN 1 ELSE 0 END)
 FROM T 
 JOIN T T2
   ON T.UTCTime = T2.UTCTime 
    AND T.RowRank = T2.RowRank -1
 GROUP BY T.UTCTime

如果您运行;WITH T AS ( )内部的部分,您会看到我们正在查看我们正在查看的时间以及按时间顺序排列的值。通过连接到自身并评估与RowRank - 1上的下一行(JOIN)相比较的每一行,在下面的递归部分中使用它。