Удаление дубликатов на основе одного значения - PullRequest
0 голосов
/ 16 октября 2018
    customer id name    Pay_type
    1111    aaaa    regular
    1111    aaaa    late
    1111    aaaa    regular
    1111    aaaa    regular
    2222    bbbb    regular
    2222    bbbb    regular
    2222    bbbb    regular
    3333    cccc    regular
    3333    cccc    late
    4444    dddd    regular
    4444    dddd    regular

У меня есть SQL-запрос, который дает мне вышеуказанный результат, и я хочу, чтобы этот результат удалил любого клиента, у которого есть просроченная плата

, вывод должен быть:

customer id name    Pay_type
2222    bbbb    regular
2222    bbbb    regular
2222    bbbb    regular
4444    dddd    regular
4444    dddd    regular

select 
distinct a.customer_id, 
a.name, 
pay_type 
from table a 
left join table b on a.customer_id= b.id 
left join table c on c.id = b.pay_id 
where b.status = 'Done

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Я бы сделал это как анти-объединение:

select *
from table a
where not exists (
  select null
  from table b
  where
    a.customer_id = b.customer_id and
    b.pay_type = 'late'
)

Это имеет преимущества по сравнению с отличным или непринятым подходом в том, что он перестанет смотреть после того, как найдет совпадение.Это должно работать эффективно как для больших, так и для небольших наборов данных.

Любое решение, использующее различные, должно будет оценить весь набор данных, а затем удалить дубликаты.

0 голосов
/ 17 октября 2018

Изменение общего выражения таблицы:

WITH orig_result_set AS (
    select 
    distinct a.customer_id, 
    a.name, 
    pay_type 
    from table a 
    left join table b on a.customer_id= b.id 
    left join table c on c.id = b.pay_id 
    where b.status = 'Done'
),

exclude_late_payments AS (
    SELECT DISTINCT customer_id
    FROM orig_result_set
    WHERE pay_type = 'late'
),

on_time_payments AS (
    SELECT customer_id,
           name,
           pay_type
    FROM orig_result_set
    WHERE customer_id NOT IN exclude_late_payments
)

SELECT *
FROM on_time_payments
0 голосов
/ 17 октября 2018

Я не совсем уверен, как выглядят ваши таблицы, но вы могли бы сделать что-то вроде:

WHERE customer_id NOT IN (
    SELECT customer_id
    FROM table_with_customer_and_pay_type
    WHERE pay_type = 'late'
    GROUP BY customer_id )
...