2012-11-09 48 views
0

我撕開了所有的美國郵政編碼,搜索結果包括每個搜索的多個位置。我現在想弄清楚我需要搜索的最小郵編數量,以返回相同的唯一位置結果。例如郵政編碼12345返回商店A,B,C,D和郵政編碼12347返回A,B,C和郵政編碼12349返回B,C,D;我想獲得12345,因爲它獲得了所有的商店。算法最少的郵政編碼找到一組數據

+2

但是基於哪個12345將被返回,您輸入的參數是什麼,即您提交什麼作爲搜索條件? – amphibient

+1

你能告訴我們更多關於你的桌子嗎? – woz

+0

感謝您的快速回復。數據有郵政編碼,然後是商店數據。我從商店號碼中獲得獨特的數據。所以基本上一個郵政編碼會返回0-很多商店,然後我將它們分開,所以我有一個帶有zip和storeNum的表格,我可以將其綁定回原始表格。我希望能夠刷新數據而無需再次通過每個郵政編碼。我認爲戈登Linoff的答案會起作用。我今晚會嘗試。 – OnTheFly

回答

1

我假設你有兩列,郵編和商店的數據。任何給定的郵政編碼和商店可能會在數據中出現多次。

從技術上講,你要求的是一個覆蓋集。每個郵政編碼「覆蓋」一組商店。您正在尋找最小尺寸(最少郵編)的覆蓋物。

很容易得到一個覆蓋集。這裏是一個例子:

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中是可行的,因爲你需要考慮所有的郵政編碼組合。然後確定涵蓋所有商店的最小尺寸。儘管如此,上面的查詢可能足以滿足您的需要。

+0

我認爲第二個例子對於我正在嘗試做的事情已經足夠了。謝謝。 – OnTheFly

0
Select zip_code,max(stores) from (Select  zip_code,count(1) stores from mytable 
Group by zip_code)