3

解決するのが難しい問題があります。あなたが助けてくれると思います。レジストリ値に基づいて、10分ごとに正確にグループ化された何百万ものレコードを含むテーブルがあります。次に例を示します。

レコード "01 | 2011/01/03 19:18:00.300" をカウントするのに必要な時間は、19:18:00.300 から 19:28:00.299 です。このプロセスにより、レコード 01、02、03 がグループ化されます。

レコード "04 | 2011/01/03 19:29:54.289" をカウントするのに必要な時間は、19:29:54.289 から 19:39:54.288 です。このプロセスでは、レコード 04 のみがグループ化されます。

「05 | 2011/01/04 14:43:43.067」を記録すると、彼が記録を数えるのに必要な時間は、14:43:43.067 から 14:43:53.066 です。このプロセスでは、レコード 05、06、07 がグループ化されます。

「08 | 2011/01/04 14:57:55.608;」を記録します。レコードをカウントするのに必要な時間は、14:57:55.608 から 15:07:55.607 です。このプロセスでは、レコード 08、09、10、11、12、13、14、15 がグループ化されます。

入力データ:

ID   TS
01   2011/01/03 19:18:00.300
02   2011/01/03 19:18:00.503
03   2011/01/03 19:20:26.335
04   2011/01/03 19:29:54.289
05   2011/01/04 14:43:43.067
06   2011/01/04 14:50:10.727
07   2011/01/04 14:52:26.827
08   2011/01/04 14:57:55.608
09   2011/01/04 14:57:55.718
10   2011/01/04 14:59:13.603
11   2011/01/04 15:00:34.260
12   2011/01/04 15:02:55.687
13   2011/01/04 15:04:51.917
14   2011/01/04 15:06:24.760
15   2011/01/04 15:07:15.378

出力データ:

ID  TS   Count
01   2011/01/03 19:18:00.300    3
02   2011/01/03 19:29:54.289    1
03   2011/01/04 14:43:43.067    3
04   2011/01/04 14:57:55.608    8

誰でもこの問題の解決策を持っていますか? すでに、注目に感謝しています。

4

2 に答える 2

0

This may be a bit sub-optimal, but it works. The recursive query detects the start- and stop- times of the intervals; the count(*) scalar subquery counts the number of original records within each interval.

WITH RECURSIVE rr AS (
        SELECT 1::integer AS num
                , MIN(tscol) AS starter
                , MIN(tscol) + '10 min'::INTERVAL AS stopper
        FROM your_table
        UNION ALL
        SELECT
                1+rr.num AS num
                , tscol AS starter
                , tscol + '10 min'::INTERVAL AS stopper
        FROM your_table yt
        JOIN rr ON yt.tscol > rr.stopper
                AND NOT EXISTS ( SELECT *
                  FROM your_table nx
                  WHERE nx.tscol > rr.stopper
                  AND nx.tscol < yt.tscol
                )
        )
SELECT num,starter,stopper
        , (SELECT COUNT(*) FROM your_table yt
                WHERE yt.tscol BETWEEN rr.starter AND rr.stopper
        ) AS cnt
FROM rr
        ;
于 2015-07-01T14:13:51.130 に答える