2017-10-23 4 views
0

でデータを合計します。トランザクションがある毎日の開始から終了までの定期的な時間間隔で累積合計を計算するクエリを作成する必要があります(たとえば5分ごと)。アイデアは、毎日の線図を作成するために使用できるデータセットを作成することです。 私はこれにかなり新しいですし、どんな助けも大いに感謝されるでしょう。は、私は数日カバー不定期に関連するタイムスタンプ(valuedatetimeカラム)との取引(金額列)を含むテーブルを有する規則的な時間間隔

答えて

1

SQL Fiddle

Oracleの11グラムR2スキーマのセットアップ:1

CREATE TABLE table_name (amount, valuedatetime) AS 
    SELECT 1, TIMESTAMP '2017-10-22 23:45:21.234' FROM DUAL UNION ALL 
    SELECT 2, TIMESTAMP '2017-10-22 23:47:10.000' FROM DUAL UNION ALL 
    SELECT 3, TIMESTAMP '2017-10-22 23:52:41.123' FROM DUAL UNION ALL 
    SELECT 4, TIMESTAMP '2017-10-22 23:55:23.456' FROM DUAL UNION ALL 
    SELECT 5, TIMESTAMP '2017-10-22 23:58:24.789' FROM DUAL UNION ALL 
    SELECT 6, TIMESTAMP '2017-10-22 23:59:59.999' FROM DUAL UNION ALL 
    SELECT 7, TIMESTAMP '2017-10-23 00:00:00.000' FROM DUAL UNION ALL 
    SELECT 8, TIMESTAMP '2017-10-23 00:01:02.234' FROM DUAL UNION ALL 
    SELECT 9, TIMESTAMP '2017-10-23 00:05:00.000' FROM DUAL UNION ALL 
    SELECT 10, TIMESTAMP '2017-10-23 00:09:59.999' FROM DUAL; 

問合せ:

SELECT SUM(amount), 
     --channel_id, 
     TRUNC(valuedatetime) 
     + 
     TRUNC(
     (
      CAST(valuedatetime AS DATE) - TRUNC(valuedatetime) 
     ) 
     * 24 -- Hours per day 
     * 60 -- Minutes per hour 
     /5 -- group into 5 minute buckets 
     ) * 5/60/24 AS range_start 
FROM table_name 
GROUP BY 
     --channel_id, 
     TRUNC(valuedatetime), 
     TRUNC(
     (
      CAST(valuedatetime AS DATE) - TRUNC(valuedatetime) 
     ) 
     * 24 -- Hours per day 
     * 60 -- Minutes per hour 
     /5 -- group into 5 minute buckets 
     ) 

Results

| SUM(AMOUNT) |   RANGE_START | 
|-------------|----------------------| 
|   3 | 2017-10-22T23:45:00Z | 
|   3 | 2017-10-22T23:50:00Z | 
|   15 | 2017-10-23T00:00:00Z | 
|   15 | 2017-10-22T23:55:00Z | 
|   19 | 2017-10-23T00:05:00Z | 

あなたは何のエントリが、その後がない期間に含める場合:

SQL Fiddle

Oracleの11グラムR2スキーマのセットアップ

CREATE TABLE table_name (amount, valuedatetime) AS 
    SELECT 1, TIMESTAMP '2017-10-22 23:45:21.234' FROM DUAL UNION ALL 
    SELECT 2, TIMESTAMP '2017-10-22 23:47:10.000' FROM DUAL UNION ALL 
    SELECT 3, TIMESTAMP '2017-10-22 23:52:41.123' FROM DUAL UNION ALL 
    SELECT 4, TIMESTAMP '2017-10-22 23:55:23.456' FROM DUAL UNION ALL 
    SELECT 5, TIMESTAMP '2017-10-22 23:58:24.789' FROM DUAL UNION ALL 
    SELECT 6, TIMESTAMP '2017-10-22 23:59:59.999' FROM DUAL UNION ALL 
    SELECT 7, TIMESTAMP '2017-10-23 00:00:00.000' FROM DUAL UNION ALL 
    SELECT 8, TIMESTAMP '2017-10-23 00:01:02.234' FROM DUAL UNION ALL 
    SELECT 9, TIMESTAMP '2017-10-23 00:15:00.000' FROM DUAL UNION ALL 
    SELECT 10, TIMESTAMP '2017-10-23 00:19:59.999' FROM DUAL; 

クエリ1

WITH ranges (dt) AS (
    SELECT min_dt + NUMTODSINTERVAL(5 * (LEVEL - 1), 'MINUTE') 
    FROM (
    SELECT TRUNC(CAST(MIN(valuedatetime) AS DATE)) 
      + 
      TRUNC(
      (CAST(MIN(valuedatetime) AS DATE) 
      - TRUNC(MIN(valuedatetime))) 
      * 24 * 60/5 
      ) * 5/60/24 AS min_dt, 
      MAX(valuedatetime) AS max_dt 
    FROM table_name 
) 
    CONNECT BY 
     min_dt + INTERVAL '5' MINUTE * (LEVEL - 1) <= max_dt 
) 
SELECT COALESCE(SUM(amount), 0) AS total_amount, 
     --channel_id, 
     r.dt AS range_start 
FROM ranges r 
     LEFT OUTER JOIN table_name t 
     ON (r.dt    <= t.valuedatetime 
      AND t.valuedatetime < r.dt + INTERVAL '5' MINUTE) 
GROUP BY 
     --channel_id, 
     r.dt 
ORDER BY 
     --channel_id, 
     r.dt 

Results

| TOTAL_AMOUNT |   RANGE_START | 
|--------------|----------------------| 
|   3 | 2017-10-22T23:45:00Z | 
|   3 | 2017-10-22T23:50:00Z | 
|   15 | 2017-10-22T23:55:00Z | 
|   15 | 2017-10-23T00:00:00Z | 
|   0 | 2017-10-23T00:05:00Z | 
|   0 | 2017-10-23T00:10:00Z | 
|   19 | 2017-10-23T00:15:00Z | 
+0

何も起こらないとき、それはおそらく、期間についてはnull/0を含むべきである - これがこのように動作しません。 – nimdil

+0

@nimdilこのオプションを含めるように更新されました。 – MT0

+0

こんにちは、あなたのご意見とご感想の両方に非常に感謝しています。何らかの理由で、range_start列は時刻を返しませんが、日付('24 -APR-17 ')のみを返します。ソースの正確なデータ型はタイムスタンプ(0)であり、サンプルのエントリは'24 -APR-17 03.17.31.000000000 PM 'です。 CHANNELIDごとの情報を返す出力に追加の列を追加する必要がある場合は、どうすればよいでしょうか? – ehammer

関連する問題