代码之家  ›  专栏  ›  技术社区  ›  friism

SQL Server rand()聚合

  •  1
  • friism  · 技术社区  · 16 年前

    问题: 坐标表。两行可能具有相同的坐标。我们需要一个返回一组具有唯一坐标的行的查询(在返回的集合中)。注意 distinct 无法使用,因为我需要返回ID列,根据定义,该列是不可重复的。这类作品( @maxcount 是我们需要的行数, intid 是唯一的int id列):

    select top (@maxcount) max(intid)
    from Documents d
    group by d.geoLng, d.geoLat
    

    不幸的是,对于给定的坐标,它总是返回同一行,这对我的使用有点遗憾。如果我们有一个 rand() 我们可以使用聚合而不是 max() …请注意,您不能使用 最大() 使用由创建的guid newid() .

    有什么想法吗? (如果您感兴趣,这里还有更多的背景: http://www.itu.dk/~friism/blog/?p=121 )

    更新:完整解决方案 here

    3 回复  |  直到 13 年前
        1
  •  2
  •   Tom H zenazn    16 年前

    您可以使用一个CTE来完成这个任务,并在lat和long之间使用row_number函数,然后针对它使用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组合中为您提供一个随机行。

    如果我以后有更多的时间,我会设法绕过最后的障碍。

        2
  •  1
  •   Mladen Prajdic    16 年前

    这对你不起作用?

    select top (@maxcount) *
    from 
    (
        select max(intid) as id from Documents d group by d.geoLng, d.geoLat
    ) t 
    order by newid()
    
        3
  •  0
  •   Joel Coehoorn    16 年前

    你从哪里得到了这样的想法:distinct只对一列有效?无论如何,您也可以使用group by子句。