0

郵便番号データベースで、都市名と一致する個別の都市/州/国の場​​所を見つける必要があるクエリを作成しています。列は次のとおりです。

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。

ランクに基づいて個別の行を取得し、DB内のすべての列を取得するにはどうすればよいですか?どの郵便番号が返されるかは関係ありません...市/州/国ごとに1つのエントリが必要です。

SQLServer2008を使用しています。

4

4 に答える 4

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

リクエストの問題は、通常、一連のフィールド (この場合は都市/州/国) でグループ化するときに、他の列を含めないことです。これはそれを回避する方法ですが、かなり遅く、最適化できます。

于 2012-12-18T18:11:29.093 に答える
1

これが別のショットです。TOP 1 は、最初に返された特定の行を気にしないと述べたため機能することに注意してください。これは、ランク > 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
于 2012-12-18T18:46:14.150 に答える
0
select COUNT(City),City,State,Country
from
 PostalCodes
 group by City,State,Country
 order by COUNT(City)
于 2012-12-18T18:09:57.820 に答える
0

クエリから、都市、州、および国ごとの郵便番号の数を探しています。

これにより、探しているものが得られると思います。

SELECT  B.City, B.State, B.Country, COUNT(*) AS Rank
FROM    PostalCodes B
GROUP BY B.City, B.State, B.Country
于 2012-12-18T18:12:00.920 に答える