Лучший способ исключить дубликаты без создания новой таблицы - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть запрос, который использует подзапрос, чтобы определить, есть ли у элемента в объединенной таблице дублирующаяся запись, и если да, то данные не извлекаются в родительский запрос:

select
  (f.listing_datetime) as datetime,
  round(avg(f.listing_price), 0) as price,
  round(avg(f.listing_sqft), 0) as sqft,
  round(avg(f.listing_p_per_sqft), 2) as p_per_ft,
  f.listing_neighborhood, count(*) as points
from ( 
    select
      a.listing_datetime, a.listing_price, a.listing_sqft, a.listing_p_per_sqft,
      a.listing_neighborhood, i.listing_tokens, count(i.listing_tokens) as c
    from
      agg_cl_data as a
      left join incoming_cl_data_desc as i
        on a.listing_url = i.listing_url
    where a.listing_datetime between curdate() - interval 30 day and curdate()
    group by i.listing_tokens
    having c < 2
  ) as f
group by day(f.listing_datetime), f.listing_neighborhood
order by f.listing_datetime;

Как вы можете видеть, используя простой способ обработки дубликатов с предложением HAVING, я фактически теряю оригинальную запись, которая была сохранена, потому что любая агрегированная запись с большим, чем 2, выбрасывается. Есть ли лучший способ сделать это, чтобы я не потерял некоторые данные, БЕЗ создания новой таблицы, к которой будет запрашиваться?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Если вы хотите удалить повторяющиеся строки, используйте предложение DISTINCT. Если вы хотите найти дубликаты на основе разбиения на определенный столбец, используйте оконную функцию ROW_NUMBER.

На первый взгляд ваш подзапрос недействителен, поскольку вы группируете по одному столбцу и не используете никакие другие агрегатные функции в других столбцах.

select distinct
  a.listing_datetime, a.listing_price, a.listing_sqft, a.listing_p_per_sqft,
  a.listing_neighborhood, i.listing_tokens
from
  agg_cl_data as a
  left join incoming_cl_data_desc as i
    on a.listing_url = i.listing_url
where a.listing_datetime between curdate() - interval 30 day and curdate()
0 голосов
/ 20 апреля 2019

Попробуйте использовать «отличный» вместо, если «иметь» в подзапросе.Вы получите каждый URL только один раз, не теряя его, даже если для него было две записи.

Таким образом, ваш код должен быть:

... select DISTINCT a.listing_datetime, ...

и тогда нет «иметь» в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...