Postgresql 从关系中删除重复行

Postgresql 从关系中删除重复行,postgresql,duplicates,rows,Postgresql,Duplicates,Rows,我有以下生成关系的代码: SELECT book_id, shipments.customer_id FROM shipments LEFT JOIN editions ON (shipments.isbn = editions.isbn) LEFT JOIN customers ON (shipments.customer_id = customers.customer_id) 在这种关系中,既有客户ID,也有他们购买的图书的图书ID。我的目标是与书中的每本书建立关系,然后确定有多少独特的

我有以下生成关系的代码:

SELECT book_id, shipments.customer_id
FROM shipments 
LEFT JOIN editions ON (shipments.isbn = editions.isbn)
LEFT JOIN customers ON (shipments.customer_id = customers.customer_id)
在这种关系中,既有客户ID,也有他们购买的图书的图书ID。我的目标是与书中的每本书建立关系,然后确定有多少独特的客户购买了它。我假设实现这一点的一种方法是消除关系中的所有重复行,然后计算每个book_id的实例。 所以我的问题是:如何从这个关系中删除所有重复的行

谢谢


编辑:我的意思是,我希望关系中的所有行都是唯一的。例如,如果有三行相同,则应删除其中两行。

这将为您提供订单存在的所有{customer,edition}对:

SELECT *
FROM customers c
JOIN editions e ON (
    SELECT * FROM shipments s
    WHERE s.isbn = e.isbn
      AND s.customer_id = c.customer_id
    );

这将为您提供订单存在的所有{customer,edition}对:

SELECT *
FROM customers c
JOIN editions e ON (
    SELECT * FROM shipments s
    WHERE s.isbn = e.isbn
      AND s.customer_id = c.customer_id
    );

重复项在表
装运
中。您可以使用
DISTINCT
子句删除它们,然后在外部查询
分组中按
isbn对它们进行计数:

SELECT isbn, count(customer_id) AS unique_buyers
FROM (
  SELECT DISTINCT isbn, customer_id FROM shipments) book_buyer
GROUP BY isbn;
如果您想要一个所有书籍的列表,即使没有购买,您也应该
将上面的内容加入到所有书籍的列表中:

SELECT isbn, coalesce(unique_buyers, 0) AS books_sold_to_unique_buyers
FROM editions
LEFT JOIN (
  SELECT isbn, count(customer_id) AS unique_buyers
  FROM (
    SELECT DISTINCT isbn, customer_id FROM shipments) book_buyer
  GROUP BY isbn) books_bought USING (isbn)
ORDER BY isbn;
通过在计数前加入,您可以更简洁地编写:

SELECT isbn, count(customer_id) AS books_sold_to_unique_buyers
FROM editions
LEFT JOIN (
  SELECT DISTINCT isbn, customer_id FROM shipments) book_buyer USING (isbn)
GROUP BY isbn
ORDER BY isbn;

重复项在表
装运
中。您可以使用
DISTINCT
子句删除它们,然后在外部查询
分组中按
isbn对它们进行计数:

SELECT isbn, count(customer_id) AS unique_buyers
FROM (
  SELECT DISTINCT isbn, customer_id FROM shipments) book_buyer
GROUP BY isbn;
如果您想要一个所有书籍的列表,即使没有购买,您也应该
将上面的内容加入到所有书籍的列表中:

SELECT isbn, coalesce(unique_buyers, 0) AS books_sold_to_unique_buyers
FROM editions
LEFT JOIN (
  SELECT isbn, count(customer_id) AS unique_buyers
  FROM (
    SELECT DISTINCT isbn, customer_id FROM shipments) book_buyer
  GROUP BY isbn) books_bought USING (isbn)
ORDER BY isbn;
通过在计数前加入,您可以更简洁地编写:

SELECT isbn, count(customer_id) AS books_sold_to_unique_buyers
FROM editions
LEFT JOIN (
  SELECT DISTINCT isbn, customer_id FROM shipments) book_buyer USING (isbn)
GROUP BY isbn
ORDER BY isbn;

请定义副本:根据订购的书籍或下订单的客户定义副本?[重读后:客户…否:您还需要计数。请重新措辞。]听起来您只需要一个
分组依据
…Craig,我用分组依据进行了实验,但没有很好的结果,对我如何使用它有什么建议吗?请定义重复项:根据订购的书籍进行重复,还是说下订单的客户?[重读后:客户…否:您还需要一个计数。请重新措辞。]听起来您只需要一个
分组依据
…Craig,我已经用分组依据进行了实验,但没有很好的结果,对我如何使用它有何建议?