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

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

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

  1. DECLARE @Latitude float
  2. DECLARE @Longitude float
  3. DECLARE @point geography
  4. DECLARE @distance int = 1000;
  5. SET @Latitude = XX
  6. SET @Longitude = XX
  7. SET @point = geography::Point(@Latitude, @Longitude, 4326);
  8. SELECT listing_id, price from Listings WHERE @point.STDistance([GeoLocation]) <= @distance
  9. AND status = 'to_rent'

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

  1. DECLARE @CursorTestID INT = 1;
  2. DECLARE @RunningTotal BIGINT = 0;
  3. DECLARE @RowCnt BIGINT = 0;
  4. -- get a count of total rows to process
  5. SELECT @RowCnt = COUNT(0) FROM Listings
  6. WHILE @CursorTestID <= @RowCnt
  7. BEGIN
  8. SELECT Listing_ID
  9. FROM (
  10. SELECT Listing_ID, ROW_NUMBER() OVER (ORDER BY Listing_ID) AS RowNum
  11. FROM Listings
  12. ) AS MyDerivedTable
  13. WHERE MyDerivedTable.RowNum = @CursorTestID
  14. SET @CursorTestID = @CursorTestID + 1
  15. END
6qqygrtg

6qqygrtg1#

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

  1. SELECT Lis1.Listing_ID, AVG(Lis2.price) as AvgPriceNeighborhood
  2. FROM listings Lis1
  3. JOIN Listings Lis2
  4. ON Lis2.[GeoLocation].STDistance(Lis1.[GeoLocation]) <= @distance
  5. GROUP BY Lis1.Listing_ID

相关问题