Хорошо - понял;) Хитрость была в том, чтобы использовать PARTITION BY
.@ In Sane дала мне идею, когда я поняла, что сделала что-то похожее, раньше:)
Итак ... мы идем ..
SELECT
a.CityId, a.Name, b.ZipCodeId, b.Code, a.Boundary.STIntersection(b.Boundary).STArea() AS Area,
RANK() OVER (PARTITION BY b.ZipCodeId ORDER BY a.Boundary.STIntersection(b.Boundary).STArea() DESC) AS Area_Rank
FROM
Cities a
INNER JOIN ZipCodes b on a.Boundary.STIntersects(b.Boundary) = 1
where b.Code = 12010 OR b.Code = 90210
CityId Name ZipCodeId Code Area Area_Rank
----------- ---------------------------------------------------------------------------------------------------- ----------- -------------------- ---------------------- --------------------
2166 Los Angeles 9331 90210 13235413.8430175 1
1686 Beverly Hills 9331 90210 10413397.1372613 2
2635 West Hollywood 9331 90210 0 3
14570 Amsterdam 29779 12010 15369521.9602067 1
14921 Hagaman 29779 12010 1394562.70390667 2
14856 Fort Johnson 29779 12010 211058.884834718 3
14651 Broadalbin 29779 12010 0 4
(7 row(s) affected)
Итак, в этом отфильтрованном примере (Filteredпо ZipCode 12010 или 90210), мы можем видеть, что этот почтовый индекс существует в 4 разных городах / поселках.Каждый почтовый индекс может иметь от 1 до многих результатов, которые затем упорядочиваются по значению Area ..., но ключевым здесь является ключевое слово PARTITION
, которое выполняет это упорядочение по группам или разделам ZipCode.Очень забавно :) Заметьте, как почтовый индекс 90210 имеет свои собственные результаты ранга?то же самое с 12010?
Далее мы сделаем этот подзапрос и просто захватим весь ранг == 1:)
SELECT CityId, Name, ZipCodeId, Code, Area_Rank
FROM (
SELECT
a.CityId, a.Name, b.ZipCodeId, b.Code, a.Boundary.STIntersection(b.Boundary).STArea() AS Area,
RANK() OVER (PARTITION BY b.ZipCodeId ORDER BY a.Boundary.STIntersection(b.Boundary).STArea() DESC) AS Area_Rank
FROM
Cities a
INNER JOIN ZipCodes b on a.Boundary.STIntersects(b.Boundary) = 1
where b.Code = 12010 OR b.Code = 90210
) subQuery
WHERE Area_Rank = 1
CityId Name ZipCodeId Code Area_Rank
----------- ---------------------------------------------------------------------------------------------------- ----------- -------------------- --------------------
14570 Amsterdam 29779 12010 1
2166 Los Angeles 9331 90210 1
(2 row(s) affected)
Сладкий как конфетка:)
СторонаПримечание. Это также показывает, что мой Лос-Анджелес городской шейп-файл / граница поврежден, поскольку он слишком сильно пересекает почтовый индекс 90210 (что я визуально подтвердил: P)