postgresql 8.0中的汇总数据层次结构?

问题描述 投票:0回答:1

我想在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/

postgresql group-by rollup postgresql-8.0
1个回答
0
投票

由于GROUP BY ROLLUPversion 9.5一起介绍,查询没有机会工作。但是如果你考虑它的作用,在你的情况下应该很容易想出一个产生相同结果的版本。

基本上,你想拥有:

  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
;
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.