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 を与えるだけです。

2 つのwater_levelリスト (パーティション) があることを除いて、同じです。
- のすべてのレコードvalue< 10、1 から始まる独自の順次 ID を取得します。
- が のすべてのレコードはvalue>= 101 から始まる独自の順次 ID を取得します。

water_level(これは、 where 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

One thing to note, these column names probably won't work as these are DB keywords.

于 2012-08-18T06:46:07.370 に答える