问题:坐标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
答案 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子句。