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,我已经用分组依据进行了实验,但没有很好的结果,对我如何使用它有何建议?