0

我有一些这样的数据

datetime              value
2012-01-01 16:21:52     6
2012-01-01 16:22:02     5
2012-01-01 16:22:12     2
2012-01-01 16:22:22     3
2012-01-01 16:22:32     6
2012-01-01 16:22:42     9
2012-01-01 16:22:52     1
2012-01-01 16:23:02     3
2012-01-01 16:23:12     16
2012-01-01 16:24:02     7
2012-01-01 16:24:12     2
2012-01-01 16:24:22     6
2012-01-01 16:24:32     1
2012-01-01 16:24:42     8
2012-01-01 16:24:52     12
2012-01-01 16:25:02     15
2012-01-01 16:25:12     41
2012-01-01 16:25:22     29
2012-01-01 16:25:32     6
2012-01-01 16:25:42     6
2012-01-01 16:25:52     20
2012-01-01 16:26:02     10
2012-01-01 16:26:12     16
2012-01-01 16:26:22     14
2012-01-01 16:26:32     10
2012-01-01 16:26:42     6
2012-01-01 16:26:52     9
2012-01-01 16:27:02     7
2012-01-01 16:27:12     7
2012-01-01 16:27:22     17

我需要一个查询来对值 < 10 的条件的数据进行分组,我需要如下结果

from                     to                   count
2012-01-01 16:21:52     2012-01-01 16:23:02     8
2012-01-01 16:24:02     2012-01-01 16:24:42     5
2012-01-01 16:25:32     2012-01-01 16:25:42     2
2012-01-01 16:26:42     2012-01-01 16:27:12     4

我想知道如何获得“值”小于 10 的组中的数据范围和数量

4

2 回答 2

2

如果您可以访问ROW_NUMBER().
- 这存在于更新版本的 Oracle、SQL Server 等
- MySQL 中不存在

请确认您使用的是哪个 RDBMS。

如果您确实可以访问ROW_NUMBER()这里是一种方法...

WITH
  gaps_and_islands AS
(
  SELECT
    *,
    CASE WHEN value < 10 THEN 1 ELSE 0 END as is_island,
    ROW_NUMBER() OVER (                                                    ORDER BY value) AS land_level,
    ROW_NUMBER() OVER (PARTITION BY CASE WHEN value < 10 THEN 1 ELSE 0 END ORDER BY value) AS water_level
  FROM
    yourData
)
SELECT
  is_island,
  MIN(datetime_field)    AS from_datetime,
  MAX(datetime_field)    AS to_datetime,
  COUNT(*)               AS count_of_rows
FROM
  gaps_and_islands
GROUP BY
  is_island,
  (land_level - water_level)
ORDER BY
  MIN(datetime_field)

这是您第一次看到它时非常新颖的方法。因此,我将通过附加到您的数据来向您展示它是如何工作的......

datetime              value   land_level  water_level  (land_level-water_level)
2012-01-01 16:21:52     6          1             1                0
2012-01-01 16:22:02     5          2             2                0
2012-01-01 16:22:12     2          3             3                0
2012-01-01 16:22:22     3          4             4                0
2012-01-01 16:22:32     6          5             5                0
2012-01-01 16:22:42     9          6             6                0
2012-01-01 16:22:52     1          7             7                0
2012-01-01 16:23:02     3          8             8                0
2012-01-01 16:23:12     16         9            (1)              (8)
2012-01-01 16:24:02     7         10             9                1
2012-01-01 16:24:12     2         11            10                1
2012-01-01 16:24:22     6         12            11                1
2012-01-01 16:24:32     1         13            12                1
2012-01-01 16:24:42     8         14            13                1
2012-01-01 16:24:52     12        15            (2)             (13)
2012-01-01 16:25:02     15        16            (3)             (13)
2012-01-01 16:25:12     41        17            (4)             (13)
2012-01-01 16:25:22     29        18            (5)             (13)
2012-01-01 16:25:32     6         19            14                5
2012-01-01 16:25:42     6         20            15                5
2012-01-01 16:25:52     20        21            (6)             (15)
2012-01-01 16:26:02     10        22            (7)             (15)
2012-01-01 16:26:12     16        23            (8)             (15)
2012-01-01 16:26:22     14        24            (9)             (15)
2012-01-01 16:26:32     10        25           (10)             (15)
2012-01-01 16:26:42     6         26            16               10
2012-01-01 16:26:52     9         27            17               10
2012-01-01 16:27:02     7         28            18               10
2012-01-01 16:27:12     7         29            19               10
2012-01-01 16:27:22     17        30           (11)             (19)

land_level只是给每个连续记录一个从 1 开始的行 id 。

是一样的water_level,只是有两个列表(分区)。
- 所有记录value< 10从 1 开始获得自己的顺序 ID。
- 所有记录value>= 10从 1 开始获得自己的顺序 ID。

(这可以更容易看到,因为我把 () 放在water_levelwhere valueis周围>= 10

然后,当您将一个与另一个分开时,就会发生“技巧”。对于在同一间隙或岛屿中彼此相邻的所有记录,您将获得一个唯一标识符。

于 2012-08-18T07:44:15.670 回答
-1
select
from = min(datetime),
to = max(datetime),
count = count(*)
from table_name
where value < 10
group by value

需要注意的一点是,这些列名可能不起作用,因为它们是 DB 关键字。

于 2012-08-18T06:46:07.370 回答