我有一个查询使用子查询来检测连接表中的项是否有重复记录,如果是这样,数据不会被提取到父查询中:
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()