admin

SQL Server rand()聚合

sql

问题:
经纬度坐标表。两行可能具有相同的坐标。我们想要一个查询,该查询返回一组具有唯一坐标的行(在返回的行内)。请注意,这distinct是不可用的,因为我需要返回根据定义不同的id列。这类工作(@maxcount是我们需要的行数,intid是唯一的intid列):

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

更新:完整的解决方案在这里


阅读 148

收藏
2021-07-01

共1个答案

admin

您可以通过lat和long的ROW_NUMBER函数为此使用CTE,然后对它使用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和lngs,但我无法将顺序随机化。也许有人可以继续使用这种方法。但是,它将在匹配的经纬度组合中为您提供随机行。

如果我以后有更多时间,我将尽力解决最后的障碍。

2021-07-01