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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在不创建新表的情况下排除重复项的更好方法相关的知识,希望对你有一定的参考价值。

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

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的任何聚合记录。有没有更好的方法来做到这一点,以便我不会丢失一些数据,没有创建一个可以查询的新表?

答案

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

所以你的代码应该是:

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

然后最后没有“拥有”。

另一答案

如果要删除重复的行,请使用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()

以上是关于在不创建新表的情况下排除重复项的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

hbase - 如何在不删除表的情况下更改表结构

如何在不删除先前相同值的情况下选择具有重复项的列表中的特定数字?

如何在不监听事件的情况下从 firebase 数据库中检索数据 [重复]

如何在不创建新片段的情况下显示片段?

怎么删除ACCESS中的重复记录 只保留一条

我怎样才能在不重复的情况下重写这些方法?