SQL Server rand()聚合

时间:2008-12-10 00:22:53

标签: sql sql-server geo

问题:坐标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()创建的guid一起使用。

有什么想法吗? (如果您有兴趣,可以在这里找到更多背景资料:http://www.itu.dk/~friism/blog/?p=121

更新:完整解决方案here

3 个答案:

答案 0 :(得分:2)

你可以使用一个CTE来实现这个,使用ROW_NUMBER函数跨lat和long,然后对它使用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组合中给你一个随机行。

如果我有更多时间,我会试着绕过最后一个障碍。

答案 1 :(得分:1)

这对你不起作用?

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

答案 2 :(得分:0)

你在哪里知道DISTINCT只适用于一列?无论如何,您还可以使用GROUP BY子句。