Удаление повторяющихся строк из отношения
У меня есть следующий код, который производит отношение:
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)
В этом отношении есть customer_ids, а также book_ids книг, которые они купили. Моя цель - создать связь с каждой книгой в ней, а затем с тем, сколько уникальных клиентов купили ее. Я предполагаю, что один из способов добиться этого - удалить все повторяющиеся строки в отношении, а затем подсчитать количество экземпляров каждого book_id. Поэтому мой вопрос: как я могу удалить все повторяющиеся строки из этого отношения?
Спасибо!
РЕДАКТИРОВАТЬ: Итак, я имею в виду, что я хочу, чтобы все строки в отношении были уникальными. Например, если есть три одинаковые строки, две из них должны быть удалены.
2 ответа
Дубликаты в таблице shipments
, Вы можете удалить их с DISTINCT
предложение, а затем считать их во внешнем запросе GROUP BY
ISBN:
SELECT isbn, count(customer_id) AS unique_buyers
FROM (
SELECT DISTINCT isbn, customer_id FROM shipments) book_buyer
GROUP BY isbn;
Если вы хотите получить список всех книг, даже если не было сделано никаких покупок, вам следует LEFT JOIN
выше к списку всех книг:
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;
Это даст вам все пары {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
);