簡體   English   中英

遞歸幾何查詢:五個最接近的實體

[英]recursive geometric query : five closest entities

問題是,是否可以在不依靠過程邏輯的情況下完成下面描述的查詢,也就是說,是否可以僅通過SQL,CTE和窗口函數來處理它? 我正在使用SQL Server 2012,但問題不限於該引擎。

假設我們有一個擁有25萬行的國家音樂教師數據庫:

  teacherName, address, city, state, zipcode, geolocation, primaryInstrument

其中geolocation列是具有最佳鑲嵌化索引的geography::point數據類型。

用戶希望最靠近他的五個吉他老師。 如果我們選擇一些任意的距離截止點 (例如50英里), 使用開窗函數的查詢的性能就足夠好,這樣我們就不會選擇全部250,000行,然后按距離對它們進行排序並采用最接近的5。

但是,例如,如果用戶從不同的文化中選擇樂器,例如西塔琴,烏德或巴拉萊卡琴,則任意的50英里半徑截斷可能並不總是成功地吸引5名老師。 在她所在位置50英里范圍內,可能沒有五名此類樂器的老師。

此外,現在假設我們有一個查詢,其中一個音樂學院向我們發送了250名歌手的列表,這些歌手是即將到來的一年入學的學生,他們希望我們向他們發送五個最接近的語音教練, 每個人 ,以便這些學生可以在到達校園之前安排一些輔導。 我們必須掃描教師數據庫250次(即掃描地理位置索引),因為這些學生都住在全國各地。

因此,我想知道,對於涉及250個學生位置列表的后一個查詢,是否有可能編寫一個遞歸查詢,其半徑從小開始,例如10英里,然后每次迭代增加10英里,直到達到最大半徑100英里或找到所需的五(5)名老師? 難道只有那些尚未與所需的5名老師相匹配的學生才能這樣做嗎?

我認為這不能僅通過SQL來完成,而必須通過循環和臨時表來完成-但這也許是因為我還沒有弄清楚如何僅通過SQL來完成。

PS primaryInstrument列也可以減小按距離排序的集合的大小,但是出於這個問題,請忽略這一點。

編輯:這是一個示例查詢。 SINGER(提交的)數據集包含一列,該列具有任意半徑以將地理結果限制為較小的子集,但是如上所述,該半徑可以定義一個圓(其中心點是學生的地理位置),該圓可能不包含所需的數字的老師。 有時提供的數據集包含數千個地址,而不僅僅是數百個。

select TEACHERSRANKEDBYDISTANCE.* from
(
select STUDENTSANDTEACHERSINRADIUS.*,
rowpos = row_number() 
over(partition by 
        STUDENTSANDTEACHERSINRADIUS.zipcode+STUDENTSANDTEACHERSINRADIUS.streetaddress 
      order by DistanceInMiles)
from
(
select
SINGER.name, 
SINGER.streetaddress, 
SINGER.city, 
SINGER.state, 
SINGER.zipcode, 
TEACHERS.name as TEACHERname, 
TEACHERS.streetaddress as TEACHERaddress, 
TEACHERS.city as TEACHERcity, 
TEACHERS.state as TEACHERstate, 
TEACHERS.zipcode as TEACHERzip,
TEACHERS.teacherid,
geography::Point(SINGER.lat, SINGER.lon, 4326).STDistance(TEACHERS.geolocation)
            / (1.6 * 1000) as DistanceInMiles
from 
SINGER left join TEACHERS
on 
( TEACHERS.geolocation).STDistance( geography::Point(SINGER.lat, SINGER.lon, 4326))   
     < (SINGER.radius * (1.6 * 1000 ))
 and TEACHERS.primaryInstrument='voice'
) as STUDENTSANDTEACHERSINRADIUS
) as TEACHERSRANKEDBYDISTANCE
where rowpos < 6    -- closest 5 is an abitrary requirement given to us

我想可能是如果您只需要獲取最接近的5位老師,而無論半徑大小,您都可以編寫如下內容。 學生將在此查詢中重復5次,我不知道您想得到什么。

select
    S.name, 
    S.streetaddress, 
    S.city, 
    S.state, 
    S.zipcode, 
    T.name as TEACHERname, 
    T.streetaddress as TEACHERaddress, 
    T.city as TEACHERcity, 
    T.state as TEACHERstate, 
    T.zipcode as TEACHERzip,
    T.teacherid,
    T.geolocation.STDistance(geography::Point(S.lat, S.lon, 4326))
    / (1.6 * 1000) as DistanceInMiles
from SINGER as S
    outer apply (
        select top 5 TT.*
        from TEACHERS as TT
        where TT.primaryInstrument='voice'
        order by TT.geolocation.STDistance(geography::Point(S.lat, S.lon, 4326)) asc
    ) as T

暫無
暫無

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

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