簡體   English   中英

如何獲取3條SQL中距離最短的記錄?

[英]How to Get 3 Records that have the Shortest Distance in SQL?

我有一個非常大的表,其中包含16萬行數據。 列是id,x,y,z,pl,bs和建築物。

對於相同的(x,y,z),存在多行(bs和pl的值不同)。

給我一個值P,所以我想得到總距離(歐幾里德距離)最短的3個不同的(x,y,z)。

例如,(x',y',z')具有3行,具有不同的pl1,pl2,pl3。 因此,距離的總和= sqrt {(pl1- P)^ 2 +(pl2- P)^ 2 +(pl3- P)^ 2}

那么,這可能僅在MySQL中做到嗎?

編輯的 P是標量值,例如列pl。 基本上(x,y,z)是3維點,但是距離是根據列pl計算的。 我想知道3個不同的點(x,y,z),它們的總距離最短,這是通過sum(pl-P)計算得出的

我想要實現的是類似於K最近鄰(KNN)算法的內容,如本鏈接所述

總而言之,給定標量值P,任務是從表中找到距離最短總和最短的3行(具有不同的x,y,z)。 距離計算為Sqrt {(P-pl1)^ 2 +(P-pl2)^ 2 + ...(P-pln)^ 2},對於(x,y,z)可能有多於1行。

SQL表

創建表腳本(添加)

Create table #TEMP (
        ID INT,
        x float,
        y float,
        z float,
        pl float,
        bs int,
        building int
        )
insert into #TEMP 
values 
(2,1582.1,-863.5,1.5,154.9,1,-1)
,(3,1602.1,-883.5,1.5,154,1,-1)
,(4,1602.1,-863.5,1.5,154.4,1,-1)
,(5,1622.1,-883.5,1.5,153.4,1,-1)
,(6,1622.1,-863.5,1.5,153.8,1,-1)
,(7,1622.1,-743.5,1.5,154.9,1,-1)
,(8,1642.1,-883.5,1.5,153.1,1,-1)
,(9,1642.1,-863.5,1.5,153.2,1,-1)
,(10,1642.1,-763.5,1.5,154.5,1,-1)
,(11,1642.1,-743.5,1.5,154,1,-1)

如果我理解正確,我不是100%,但這是我的答案。 讓我知道它是否關閉或是否有明顯的錯誤。

drop table #temp
Create table #TEMP (
        ID INT,
        x float,
        y float,
        z float,
        pl float,
        bs int,
        building int
        )
insert into #TEMP 
values 
(2,1582.1,-863.5,1.5,154.9,1,-1)
,(3,1602.1,-883.5,1.5,154,1,-1)
,(4,1602.1,-863.5,1.5,154.4,1,-1)
,(5,1622.1,-883.5,1.5,153.4,1,-1)
,(6,1622.1,-863.5,1.5,153.8,1,-1)
,(7,1622.1,-743.5,1.5,154.9,1,-1)
,(8,1642.1,-883.5,1.5,153.1,1,-1)
,(9,1642.1,-863.5,1.5,153.2,1,-1)
,(10,1642.1,-763.5,1.5,154.5,1,-1)
,(11,1642.1,-743.5,1.5,154,1,-1)


DECLARE @P FLOAT = 150

Select x,y,z,SQRT(SUM(POWER(pl-@P,2.0))) 'Distance'

from #TEMP
group by x,y,z
order by 4 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM