web-dev-qa-db-ja.com

Oracle 12cの単一の選択内の範囲パーティションごとのレコードをカウントする方法

私が探している解決策(存在する場合)は、実際のパーティションで直接パーティション分割し、計算によってnotにすることです値。

テーブル疑似コード:

create table table_1 as (part_col DATE, val_col VARCHAR2(1))
partition by range part_col (
   PARTITION t_20160515 VALUES LESS THAN (TO_DATE('2016-05-15','YYYY-MM-DD'))
   PARTITION t_20160516 VALUES LESS THAN (TO_DATE('2016-05-16','YYYY-MM-DD'))
   ...
);

擬似コードを選択:

select partition as P, count(*) as C from table_1
group by partition;

必要な結果

  P        |  C
-----------|-----
2016-05-15 | 8
2016-05-16 | 99

機能しますが、私が探しているものではありません:

select trunc(part_col) P, count(*) C from table_1;
4
ScrappyDev

これを実行して、パーティションごとに選択セットを生成します

SELECT 'SELECT ' || chr(39) || partition_Name || chr(39) || ', count(*) 
        FROM ' ||table_name ||' partition (' || partition_name || 
        ') UNION ALL ' as test 
FROM all_tab_partitions 
WHERE table_Name = 'Table_1'

次のような結果になります:

SELECT 'P1', count(*) FROM Table_1 partition (P1) UNION ALL 
SELECT 'P2', count(*) FROM Table_1 partition (P2) UNION ALL 
SELECT 'P3', count(*) FROM Table_1 partition (P3) UNION ALL 
SELECT 'P4', count(*) FROM Table_1 partition (P4) UNION ALL 
SELECT 'P5', count(*) FROM Table_1 partition (P5) UNION ALL

結果をコピーして貼り付け、最後のユニオンをすべて削除してから実行します。パフォーマンスについてはよくわかりません... 5つのパーティションを持つテーブルにヒットすると、約2秒間で行が完了しました。

3
xQbert