Просмотрите список домов и найдите аналоги в MS SQL - PullRequest
1 голос
/ 21 июня 2020

У меня есть набор данных о домах / объектах недвижимости с указанием долготы и широты. Я хочу сравнить цены (на продажу и на аренду) с соседними списками и иметь возможность увидеть среднее значение для аналогичных домов в радиусе, скажем, 1 мили.

Думаю, мне нужно проехать через al oop или курсор?

Я использую MS SQL 2019.

Это то, что я пробовал до сих пор:

Таблица списков (упрощенная):

  • list_id (nvarchar)
  • долгота (float)
  • широта (float)
  • num_bedrooms (int)
  • цена (int)
  • rent_or_sale (nvarchar)
  • GeoLocation (geography)

Я заполнил столбец GeoLocation на основе столбцов долготы и широты.

Я могу получить списки в пределах 1 км с использованием следующего кода, который отлично работает (после того, как я установил долготу и широту вручную)

DECLARE @Latitude float 
DECLARE @Longitude float
DECLARE @point geography
DECLARE @distance int = 1000; 

SET @Latitude = XX
SET @Longitude  = XX

SET @point = geography::Point(@Latitude, @Longitude, 4326);


SELECT listing_id, price from Listings WHERE @point.STDistance([GeoLocation]) <= @distance
AND status = 'to_rent'

Я хочу перебрать все списки в таблице списков, вернуть свойства в заданное расстояние и сохраните его в таблице Comparables wh Затем я смогу запустить средние / другие значения cal c 's

Таблица сравнения:

  • list_id (nvarchar)
  • other_listing_id (nvarchar)
  • other_listing_price (int)
  • other_listing_price_type (nvarchar)
  • other_listing_distance (int)

Я думаю, мне нужно l oop через все элементы в Таблица списков для создания этого?

Я пытаюсь выполнить следующий код, чтобы выполнить l oop, но его выполнение занимает много времени, и это без выполнения запроса расстояния, просто al oop по всем рядам. (в настоящее время 30 минут и все еще не завершено)

Таблица списков в настоящее время содержит около 10 тыс. строк.

На правильном ли я пути или есть более оптимальный способ запустить это?

DECLARE @CursorTestID INT = 1;
DECLARE @RunningTotal BIGINT = 0;
DECLARE @RowCnt BIGINT = 0;

-- get a count of total rows to process 
SELECT @RowCnt = COUNT(0) FROM Listings
 
WHILE @CursorTestID <= @RowCnt
BEGIN

   SELECT Listing_ID 
    FROM (
        SELECT Listing_ID, ROW_NUMBER() OVER (ORDER BY Listing_ID) AS RowNum
        FROM Listings
    ) AS MyDerivedTable
    WHERE MyDerivedTable.RowNum = @CursorTestID



   SET @CursorTestID = @CursorTestID + 1 
 
END

1 Ответ

0 голосов
/ 21 июня 2020

Вам не нужен al oop. Следует избегать петель в SQL. Просто используйте простой JOIN:

например

SELECT Lis1.Listing_ID, AVG(Lis2.price) as AvgPriceNeighborhood
FROM listings Lis1
JOIN Listings Lis2
    ON Lis2.[GeoLocation].STDistance(Lis1.[GeoLocation]) <= @distance
GROUP BY Lis1.Listing_ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...