1

问题:坐标纬度/经度表。两行可能具有相同的坐标。我们想要一个返回一组具有唯一坐标的行(在返回的集合内)的查询。请注意,这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 )

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

4

3 回答 3

2

您可能可以通过 ROW_NUMBER 函数在 lat 和 long 中使用 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,我无法使顺序随机。也许有人可以继续使用这种方法。不过,它会在匹配的 lat 和 lng 组合中为您提供一个随机行。

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

于 2008-12-10T02:42:54.460 回答
1

这对你不起作用?

select top (@maxcount) *
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat
) t 
order by newid()
于 2008-12-10T11:29:50.530 回答
0

您从哪里得到 DISTINCT 仅适用于一列的想法?无论如何,您也可以使用 GROUP BY 子句。

于 2008-12-10T00:30:41.327 回答