У меня есть набор данных о домах / объектах недвижимости с указанием долготы и широты. Я хочу сравнить цены (на продажу и на аренду) с соседними списками и иметь возможность увидеть среднее значение для аналогичных домов в радиусе, скажем, 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