Как я могу добавить TOP 1 и PARTITION BY в оператор Sql UPDATE? - PullRequest
0 голосов
/ 14 января 2011

У меня есть следующее заявление sql - оно пытается найти все почтовые индексы, которые пересекают наши велосипедные дорожки: -

UPDATE a
SET a.ZipCodeId = d.ZipCodeId
FROM [dbo].[BikePaths] a
    INNER JOIN [dbo].[BikePathBoundaries] b ON b.ZipCodeId = c.ZipCodeId
    INNER JOIN [dbo].[ZipCodeBoundaries] c ON b.Boundary.STIntersects(c.Boundary) = 1

Что хорошо ... если велосипедная дорожка не пересекает два или более почтовых индекса (что часто случается). Итак, я хочу сказать, Get the zipcode which this bikepath MOSTLY intersects (у меня есть другой список в другом месте для всех bikpath к почтовым индексам).

Если бы это было SELECT заявление, оно бы выглядело примерно так ...

SELECT a.BikePathId, a.BikePathName, c.ZipCodeId, d.ZipCode,
    c.Boundary.STIntersection(d.Boundary).STArea() AS Area,
    ROW_NUMBER() OVER (PARTITION BY a.BikePathId ORDER BY c.Boundary.STIntersection(d.Boundary).STArea() DESC) AS RowNumber
FROM [dbo].[BikePaths] a
    INNER JOIN [dbo].[BikePathBoundaries] b on a.BikePathId = b.BikePathId
    INNER JOIN [dbo].[ZipCodeBoundaries] c on b.Boundary.STIntersects(c.Boundary) = 1
    INNER JOIN [dbo].[ZipCodes] d on c.ZipCodeId = d.ZipCodeId

, а затем я могу просто добавить TOP 1 WHERE RowNumber = 1, чтобы убедиться, что я получаю по одной строке на BikePath ... с почтовым индексом, по которому этот велосипедный путь в основном содержится в / пересекается.

Я знаю, что 2-е утверждение Sql выглядит неопрятно, с добавлением этого геопространственного материала ... но может ли кто-нибудь помочь мне включить это в UPDATE заявление?

1 Ответ

3 голосов
/ 14 января 2011

Я не использую геопространственные запросы, но не могли бы вы поместить свой второй запрос в общее табличное выражение и присоединить его к полю row_number = 1?

;WITH CTE AS (
 SELECT a.BikePathId, c.ZipCodeId,
     Rnum =ROW_NUMBER() OVER (PARTITION BY a.BikePathId ORDER BY c.Boundary.STIntersection(d.Boundary))
 FROM      [dbo].[BikePaths] a
    INNER JOIN [dbo].[BikePathBoundaries] b on a.BikePathId = b.BikePathId
    INNER JOIN [dbo].[ZipCodeBoundaries] c on b.Boundary.STIntersects(c.Boundary) = 1
    INNER JOIN [dbo].[ZipCodes] d on c.ZipCodeId = d.ZipCodeId)
UPDATE a
SET a.ZipCodeId = cte.ZipCodeId
FROM [dbo].[BikePaths] a
    INNER JOIN cte on cte.bikepathid =a.bikepathid and cte.rnum=1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...