0

postgresql 8.0 でロールアップしようとしています。postgresql の最新バージョンには ROLLUP 関数がありますが、postgresql 8.0 でロールアップを実装するにはどうすればよいですか? 誰でも同じ経験がありますか?

私は以下を試しました

SELECT
    EXTRACT (YEAR FROM rental_date) y,
    EXTRACT (MONTH FROM rental_date) M,
    EXTRACT (DAY FROM rental_date) d,
    COUNT (rental_id)
FROM
    rental
GROUP BY
    ROLLUP (
        EXTRACT (YEAR FROM rental_date),
        EXTRACT (MONTH FROM rental_date),
        EXTRACT (DAY FROM rental_date)
    );

しかし、次のエラーが発生します。

42883: function rollup( integer, integer, integer) does not exist

http://www.postgresqltutorial.com/postgresql-rollup/から続く

4

1 に答える 1

0

バージョン 9.5GROUP BY ROLLUPで導入されたように、クエリが機能する可能性はありません。しかし、それが何をするかを考えると、あなたの場合、同じ結果を生成するバージョンを思いつくのは非常に簡単なはずです.

基本的に、次のものが必要です。

  1. 全体の合計
  2. 年額
  3. と月額
  4. 毎日のカウントのために

実際に必要なものが明確になるように、上記を特別な方法で記述しました。

  1. 毎日のカウントを生成する
  2. 毎日のカウントから月ごとの合計を生成する
  3. 毎月の合計または毎日のカウントから年間の合計を生成する
  4. 年額、月額、または日額から合計を生成する
  5. UNION ALL以上、お好きな順番で

のデフォルトでGROUP BY ROLLUPは、最初に合計を書き出し、次に で個々のグループ化セットを書き出しNULLS LASTます。次のクエリは同じことを行います。

WITH
    daily AS (
        SELECT EXTRACT (YEAR FROM rental_date) y, EXTRACT (MONTH FROM rental_date) M, EXTRACT (DAY FROM rental_date) d, COUNT (rental_id) AS count
        FROM rental
        GROUP BY 1, 2, 3
    ),
    monthly AS (
        SELECT y, M, NULL::double precision d, SUM (count) AS count
        FROM daily
        GROUP BY 1, 2
    ),
    yearly AS (
        SELECT y, NULL::double precision M, NULL::double precision d, SUM (count) AS count
        FROM monthly
        GROUP BY 1
    ),
    totals AS (
        SELECT NULL::double precision y, NULL::double precision M, NULL::double precision d, SUM (count) AS count
        FROM yearly
    )
SELECT * FROM totals
UNION ALL
SELECT * FROM daily
UNION ALL
SELECT * FROM monthly
UNION ALL
SELECT * FROM yearly
;

上記はPostgreSQL 8.4+で動作します。そのバージョンさえ持っていない場合は、UNION集計データを再利用せずに古い学校にフォールバックする必要があります。

SELECT NULL::double precision y, NULL::double precision M, NULL::double precision d, COUNT (rental_id) AS count
FROM rental
UNION ALL
SELECT EXTRACT (YEAR FROM rental_date) y, EXTRACT (MONTH FROM rental_date) M, EXTRACT (DAY FROM rental_date) d, COUNT (rental_id) AS count
FROM rental
GROUP BY 1, 2, 3
UNION ALL
SELECT EXTRACT (YEAR FROM rental_date) y, EXTRACT (MONTH FROM rental_date) M, NULL::double precision d, COUNT (rental_id) AS count
FROM rental
GROUP BY 1, 2
UNION ALL
SELECT EXTRACT (YEAR FROM rental_date) y, NULL::double precision M, NULL::double precision d, COUNT (rental_id) AS count
FROM rental
GROUP BY 1
;
于 2019-04-08T05:41:48.550 に答える