1

我有一个有 2 列的表。UTC 时间和值。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 小提琴

4

3 回答 3

1

以下是您需要的查询和工作解决方案注意:我将时间范围更改为 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'
于 2013-06-27T16:30:48.873 回答
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 - 1JOIN.

于 2013-06-27T16:58:05.913 回答
0
select SUBSTRING_INDEX(UTCTime,':',1) as time,value, count(*)-1 as total
from foo group by value,time having total >= 1;

小提琴

于 2013-06-27T16:48:07.667 回答