sql server - 如何从邮政编码数据库中选择不同的位置?

时间:2012-12-18 17:52:38

标签: sql-server sql-server-2008 distinct

我正在编写一个查询,需要在邮政编码数据库中找到与城市名称匹配的不同城市/州/国家/地区。列是:

Country, PostalCode, City, State, StateAbbr, County, CountryCode, Latitude, Longitude

结果集需要包含所有这些列。

使用查询字符串:“Brooklyn”作为示例,我至少可以为每行分配一个等级,如下所示:

select b.*,
  (select count(*) from PostalCodes b2 
   where b.City = b2.City AND b.[State] = b2.[State] AND b.Country = b2.Country) as Rank
from PostalCodes b
where b.City LIKE 'Brooklyn%'

结果集有66行,其中14行是数据库中有一个条目的位置,因此它们的等级为1.其余52行用于纽约布鲁克林,在数据库中有52个条目,并被分配等级52。

如何根据Rank获取不同的行,并获取数据库中的所有列?我不关心返回哪个邮政编码...我只想要每个城市/州/国家/地区有一个条目。

我正在使用SQL Server 2008。

4 个答案:

答案 0 :(得分:1)

假设每个具有相同城市/州/国家/地区组合的记录在每个其他字段中具有相同的值,您可以使用此查询(尽管它有点像黑客):

SELECT b.*,
       PostalCode = (SELECT TOP 1 PostalCode FROM PostalCodes b2 WHERE b.City = b2.City AND b.[State] = b2.[State] AND b.Country = b2.Country),
       StateAbbr = (SELECT TOP 1 StateAbbr FROM PostalCodes b2 WHERE b.City = b2.City AND b.[State] = b2.[State] AND b.Country = b2.Country),
       County = (SELECT TOP 1 County FROM PostalCodes b2 WHERE b.City = b2.City AND b.[State] = b2.[State] AND b.Country = b2.Country), 
       CountryCode = (SELECT TOP 1 CountryCode FROM PostalCodes b2 WHERE b.City = b2.City AND b.[State] = b2.[State] AND b.Country = b2.Country), 
       Latitude = (SELECT TOP 1 Latitude FROM PostalCodes b2 WHERE b.City = b2.City AND b.[State] = b2.[State] AND b.Country = b2.Country), 
       Longitude = (SELECT TOP 1 Longitude FROM PostalCodes b2 WHERE b.City = b2.City AND b.[State] = b2.[State] AND b.Country = b2.Country)

FROM(
SELECT DISTINCT CITY, STATE, COUNTRY
FROM PostalCodes
) b

您的请求的问题通常是您按一组字段(在您的案例中为城市/州/国家/地区)进行分组时,您不包含任何其他列。这是一种方法,虽然它很慢并且可以进行优化。

答案 1 :(得分:1)

这是另一个镜头。请注意TOP 1的工作原理是因为您声明您不关心首先返回哪个特定行,并且在Rank>的情况下这将返回任意行。 1。

SELECT  X.Rank, Y.*
FROM (  SELECT  B.City, B.State, B.Country, COUNT(*) AS [Rank]
        FROM    PostalCodes B
        GROUP BY B.City, B.State, B.Country
        ) X 
JOIN (SELECT ROW_NUMBER() OVER(PARTITION BY City, State, Country ORDER BY City, State, Country) AS RN,
        *
        FROM Postalcodes)
    Y
ON X.City = Y.City
AND X.State = Y.State
AND X.Country = Y.Country
WHERE Y.RN = 1              

这是另一次尝试。

请注意,查询性能将严重依赖于可用的索引。我相信我以前使用过这个表,并且由供应商提供的索引不是这种查询的最佳选择。

SELECT  RNK.Rank, PC.*
FROM    Postalcodes PC
JOIN (
    SELECT  MAX(PostalCode) as PostalCode,
            City, 
            StateAbbr, 
            CountryCode, 
            Count(*) AS Rank

    FROM    Postalcodes P
    group by city, stateabbr, countrycode
    ) RNK
ON  RNK.PostalCode = PC.PostalCode
AND RNK.City        = PC.City
AND RNK.StateAbbr   = PC.StateAbbr
AND RNK.CountryCode = PC.CountryCode

答案 2 :(得分:0)

select COUNT(City),City,State,Country
from
 PostalCodes
 group by City,State,Country
 order by COUNT(City)

答案 3 :(得分:0)

根据您的查询,您正在查找按城市,州和国家/地区划分的邮政编码。

我认为这会给你你想要的东西:

SELECT  B.City, B.State, B.Country, COUNT(*) AS Rank
FROM    PostalCodes B
GROUP BY B.City, B.State, B.Country