我浏览了所有美国邮政编码,搜索结果包含每次搜索的多个位置。我现在想弄清楚我需要搜索的最小数量的zipcodes,以返回相同的唯一位置结果。例如邮政编码12345返回商店A,B,C,D和邮政编码12347返回A,B,C和邮政编码12349返回B,C,D;我想得到12345,因为它得到了所有商店。
答案 0 :(得分:1)
我假设你的数据有两列,zipcode和store。任何给定的邮政编码和商店可能会在数据中出现多次。
从技术上讲,你所要求的是一套遮盖物。每个邮政编码“涵盖”一组商店。您正在寻找最小尺寸(最少的邮政编码)的遮盖物。
很容易获得遮盖物。这是一个例子:
select distinct zipcode
from (select store, min(zipcode) as zipcode
from t
group by store
) t
对此的修改可能会让您接近您想要的。对于每个商店,如果您选择覆盖该邮政编码的大多数商店的邮政编码,您将有一个贪婪的算法来选择覆盖集。这是一种方式:
select distinct zipcode
from (select store, zipcode
from (select store, zipcode, count(*) as numstores,
row_number() over (partition by store order by count(*) desc) as seqnum
from t
group by store, zipcode
) t
where seqnum = 1
) t
但是,贪心算法无法保证产生最少数量的邮政编码。不幸的是,我不认为你的问题的一般解决方案在SQL中是可行的,因为你需要考虑邮政编码的所有组合。然后确定涵盖所有商店的最小的商店。但是,上述查询可能足以满足您的目的。
答案 1 :(得分:0)
Select zip_code,max(stores) from (Select zip_code,count(1) stores from mytable
Group by zip_code)