在不创建新表的情况下排除重复项的更好方法

问题描述 投票:0回答:2

我有一个查询使用子查询来检测连接表中的项是否有重复记录,如果是这样,数据不会被提取到父查询中:

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子句的dupes,我实际上丢失了存储的原始记录,因为抛出了大于2的任何聚合记录。有没有更好的方法来做到这一点,以便我不会丢失一些数据,没有创建一个可以查询的新表?

mysql sql subquery
2个回答
0
投票

如果在subqerry中'have',请尝试使用'distinct'。你只会获得一次网址而不会丢失它,即使它有两个条目。

所以你的代码应该是:

...选择DISTINCT a.listing_datetime,...

然后最后没有“拥有”。


0
投票

如果要删除重复的行,请使用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()
© www.soinside.com 2019 - 2024. All rights reserved.