算法最少的邮政编码来查找数据集

时间:2012-11-09 18:29:54

标签: sql sql-server

我浏览了所有美国邮政编码,搜索结果包含每次搜索的多个位置。我现在想弄清楚我需要搜索的最小数量的zipcodes,以返回相同的唯一位置结果。例如邮政编码12345返回商店A,B,C,D和邮政编码12347返回A,B,C和邮政编码12349返回B,C,D;我想得到12345,因为它得到了所有商店。

2 个答案:

答案 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)