Удаление повторяющихся строк из отношения

У меня есть следующий код, который производит отношение:

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
    );
Другие вопросы по тегам