SQL Server rand () агрегат - PullRequest
       18

SQL Server rand () агрегат

1 голос
/ 10 декабря 2008

Задача: таблица координат широта / долгота. Две строки могут потенциально иметь одинаковую координату. Нам нужен запрос, который возвращает набор строк с уникальными координатами (в возвращенном наборе). Обратите внимание, что 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)

ОБНОВЛЕНИЕ: полное решение здесь

Ответы [ 3 ]

2 голосов
/ 10 декабря 2008

Вы можете использовать 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 и lngs, и я не смог сделать заказ случайным. Может быть, кто-то может продолжить этот подход. Это даст вам случайную строку в соответствующих комбинациях lat и lng.

Если у меня будет больше времени, я постараюсь обойти это последнее препятствие.

1 голос
/ 10 декабря 2008

это у вас не работает?

select top (@maxcount) *
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat
) t 
order by newid()
0 голосов
/ 10 декабря 2008

Откуда вы взяли, что DISTINCT работает только для одного столбца? В любом случае, вы также можете использовать предложение GROUP BY.

...