문제
문제: 좌표 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()
구별이 한 열에서만 작동한다는 아이디어는 어디에서 얻었습니까? 어쨌든, 당신은 또한 그룹별 절을 사용할 수도 있습니다.