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