sql server—遍历房屋列表,并在ms sql中查找可比较项

rdlzhqv9  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(357)

我有房子/房地产列表以及经纬度的数据集。我想比较价格(出售和租赁)与邻近的上市,并能够看到一个平均类似的房子在说1英里半径。
我想我需要运行一个循环或光标?
我正在运行ms sql 2019。
这就是我迄今为止所尝试的:
列表(简化):
列表\u id(nvarchar)
经度(浮动)
纬度(浮动)
卧室数量(内景)
价格(国际)
租售(nvarchar)
地理位置
我已经根据经度和纬度列填充了地理位置列。
我可以使用下面的代码在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'

我要做的是遍历listings表中的所有列表,将给定距离内的属性带回,并将其存储到可比较表中,然后在该表中运行平均值/其他计算
可比表:
列表\u id(nvarchar)
其他清单id(nvarchar)
其他挂牌价格(国际)
其他价格类型(nvarchar)
其他距离(int)
我想我需要遍历listings表中的所有项来构建这个?
我正在尝试下面的代码来执行循环-但是运行起来需要很长时间,而且这不需要运行距离查询,只需要循环所有行(目前30分钟仍未完成)
listings表当前包含大约10k行。
我是在正确的轨道上,还是有更好的方法来运行这个?

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
6qqygrtg

6qqygrtg1#

你不需要循环。在sql中应该避免循环。只需使用一个简单的连接:
例如

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

相关问题