문제

문제: 좌표 lat/lngs의 표. 두 행은 잠재적으로 동일한 좌표를 가질 수 있습니다. 우리는 고유 한 좌표 (반환 된 세트 내)로 행을 반환하는 쿼리를 원합니다. 주목하십시오 distinct 정의상 뚜렷한 ID 열을 반환해야하기 때문에 사용할 수 없습니다. 이런 종류의 작품 (@maxcount 필요한 행의 수입니다. intid 고유 한 int id 열) :

select top (@maxcount) max(intid)
from Documents d
group by d.geoLng, d.geoLat

불행히도 주어진 좌표에 대해 항상 같은 행을 반환 할 것입니다. 만약 우리 만 있었다면 rand() 대신 사용할 수있는 집계 max()... 사용할 수 없습니다 max() 작성된 안내서와 함께 newid().

어떤 아이디어? (관심이 있다면 여기에 더 많은 배경이 있습니다. http://www.itu.dk/~friism/blog/?p=121)

업데이트 : 전체 솔루션 여기

도움이 되었습니까?

해결책

LAT와 Long의 Row_number 함수와 함께 CTE를 사용할 수 있고 Rand ()를 사용하여 Rand ()를 사용할 수 있습니다. 같은 것 :

WITH cte AS
(
    SELECT
        intID,
        ROW_NUMBER() OVER
            (
                PARTITION BY geoLat, geoLng
                ORDER BY NEWID()
            ) AS row_num,
        COUNT(intID) OVER (PARTITION BY geoLat, geoLng) AS TotalCount
    FROM
        dbo.Documents
)
SELECT TOP (@maxcount)
    intID, RAND(intID)
FROM
    cte
WHERE
    row_num = 1 + FLOOR(RAND() * TotalCount)

이것은 항상 LAT와 LNG의 첫 번째 세트를 반환하며 주문을 무작위로 만들 수 없었습니다. 어쩌면 누군가이 접근법을 계속할 수 있습니다. 그래도 일치하는 LAT 및 LNG 조합 내에서 임의의 행을 제공합니다.

더 많은 시간이 있다면 마지막 장애물을 돌아 다니려고 노력할 것입니다.

다른 팁

이것은 당신에게 효과가 없습니까?

select top (@maxcount) *
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat
) t 
order by newid()

구별이 한 열에서만 작동한다는 아이디어는 어디에서 얻었습니까? 어쨌든, 당신은 또한 그룹별 절을 사용할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top