【问题标题】:Postgresql: How to remove duplicate rows while joining?Postgresql:如何在加入时删除重复的行?
【发布时间】:2015-07-26 14:46:17
【问题描述】:

我有两个名为 charges 和 orders 的 postgresql 表。我正在尝试创建一个matview,其中包含多少收费变成订单的数据,并且它是值得的。两个表没有直接关系,下面是两者的表结构

收费

|日期 |交易ID |金额 |
|--------|----|--------|
| 4 月 23 日 | abcdef | 36 |
| 4 月 23 日 | fghijkl | 198 |
| 4 月 24 日 | yyyyyy | 200 |

订单

|日期 | order_id |
|--------|----------|
| 4 月 23 日 | abcdef |
| 4 月 23 日 | abcdef |
| 4 月 24 日 | yyyyyy |

下面是我用来生成 matview 的查询,

CREATE MATERIALIZED VIEW sales AS
    SELECT ch.date AS date,
           (ord.id IS NOT NULL) as placed_order,
           COUNT(DISTINCT(ch.transaction_id)) AS attempts,
           SUM(ch.amount) AS amount
    FROM charges ch
    LEFT OUTER JOIN orders as ord ON ch.transaction_id = ord.order_id
    GROUP BY ch.date

该问题是由视图中生成的Amount 列引起的。由于orders表重复,左外连接时返回多行charges,数量基本在增加。

有没有办法在自己加入时从订单中Distinctorder_id 列?

或者有没有办法区分order_id 并在查询本身时对金额求和?我尝试了子查询和自加入,但没有运气。

【问题讨论】:

    标签: postgresql join postgresql-9.3 materialized-views


    【解决方案1】:

    您可以对表orders 进行子查询以过滤掉重复项:

    CREATE MATERIALIZED VIEW sales AS
      SELECT ch.date AS date,
             (ord.order_id IS NOT NULL) AS placed_order,
             count(ch.transaction_id) AS attempts,
             sum(ch.amount) AS amount
      FROM charges ch
      LEFT JOIN (
        SELECT DISTINCT date, order_id FROM orders) ord ON ch.transaction_id = ord.order_id
      GROUP BY 1, 2

    【讨论】:

    • 这仍然给出了重复的数据。尝试从 count(DISTINCT(ch.transaction_id)) 中删除 DISTINCT 计数会有所不同..
    • 对不起,只有在join的SELECT语句中添加id时它不起作用。
    • 从问题来看,结合您提供的示例查询,您要进行聚合的行集并不清楚。请尝试编辑您的问题,如果您需要更多帮助,我会再看一看。
    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2017-02-17
    • 2014-07-06
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多