SQL Server SQL -仅计算当前行值与上面行之间的最小差值

hs1ihplo  于 2023-02-03  发布在  其他
关注(0)|答案(2)|浏览(156)

我有一个大型的基于坐标的城市数据集,其中每个城市都有一个分数和一组坐标,这些坐标指示得分的确切位置。
数据集中没有重复的城市名称,因为我已经清理了数据,从每个城市字符串示例中只取最高分。然而,有些地方包括一个城市的多个行政区,例如布鲁克林,皇后区等,在世界各地的一些地方,如迪拜,有数百个这样的行政区。
| 城市|得分|纬度|经度|
| - ------|- ------|- ------|- ------|
| 纽约|一百|x|Y型|
| 新加坡|九十八点五|x|Y型|
| 多伦多|九十六点七|x|Y型|
| ...||||
我有代码可以计算两个纬度/经度点之间的差异,在SQL中运行良好。我需要做的是在我的数据集中运行它,并找到最小距离,只有上面的行正在计算,所以如果在我的多伦多上面的表中,它会找到多伦多和纽约,多伦多和新加坡之间的最小距离,然后显然返回多伦多/纽约的结果。
然后,我可以通过这个最小距离进行过滤(比如WHERE最小距离〉4000),以防止这些多个自治市出现,从而使我的数据集变得有用。
因为我只对每个城市的最高分感兴趣,所以我只需要计算每种情况下与上面几行的距离,因为下面几行的分数总是较低,希望这有意义。
我还没有能够尝试任何东西沿着上面提出的路线,我已经尝试搜索如何运行类似于SQL中的for循环,但不确定如何使它只分析表中上面的行。

2izufjch

2izufjch1#

好吧,假设“above”表示比current小的id,并且假设您需要最近城市id的新列-

SELECT      C.Id,
            C.City,
            ...,
            (
                SELECT      TOP(1)  C2.Id
                FROM        Cities  AS  C2
                WHERE       C2.Id   <   C.Id
                ORDER BY    ABS(C2.Latitude - C.Latitude)   --> put distance formula here
            )   AS          NearestCityId
            
FROM        Cities  AS  C
ORDER BY    C.Id
iq3niunx

iq3niunx2#

示例架构和数据:

create table cities 
(id int,
city varchar(100),
point geography);

insert into cities values (1, 'New York', 'POINT (-73.4 40.35)');
insert into cities values (2, 'Toronto', 'POINT (-79.34 43.65)');
insert into cities values (3, 'Singapore', 'POINT (103.85 1.29)');
insert into cities values (4, 'Tokyo', 'POINT (139.84 35.65)');
insert into cities values (5, 'Chicago', 'POINT (-87.62 41.88)');
insert into cities values (6, 'Milwaukee', 'POINT (-87.91 43.04)');

质询:

with cte as (
select
  c1.city as city1,
  c2.city as city2,
  c1.point.STDistance(c2.point) as dist
from cities c1
inner join cities c2
on c1.id > c2.id
),
cte2 as (
select
  row_number() over (partition by city1 order by dist asc) as row_number, 
  city1,
  city2,
  dist
from cte
)
select
  city1 as city,
  city2 as nearest_previous_city,
  dist
from cte2
where row_number = 1

具体步骤如下:

  • cte计算给定城市与之前所有城市之间的距离(c1.id > c2.id
  • cte2按距离对每个城市的邻近城市排序,并给它们一个等级(partition by city1 order by dist asc))
  • 对于具有前置任务的每个城市,cte3选择距离最近的城市(row_number = 1

相关问题