SQL Server рандов () агрегированный

голоса
1

Проблема: таблица координат LAT / LNGS. Два ряда потенциально могут иметь одинаковые координаты. Мы хотим , чтобы запрос , который возвращает набор строк с уникальными координатами ( в пределах возвращаемого набора). Обратите внимание , что distinctне может использоваться , потому что нужно возвращать столбец ID , который, по определению, различны. Этот вид работ ( @maxcountэто число строк , нам нужно, intidэто уникальный идентификатор столбца INT):

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

Она всегда будет возвращать ту же строку для заданной координаты , к сожалению, что -то вроде стыда за мое использование. Если бы мы имели rand()агрегат мы могли бы использовать вместо max()... Обратите внимание , что вы не можете использовать max()с GUIDs созданным newid().

Есть идеи? (есть еще несколько фона здесь, если вы заинтересованы: http://www.itu.dk/~friism/blog/?p=121 )

UPDATE: Полное решение здесь

Задан 10/12/2008 в 01:22
источник пользователем
На других языках...                            


3 ответов

голоса
2

Вы можете быть в состоянии использовать КТР для этого с помощью функции 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)

Это всегда будет возвращать первые наборы лат и LNGS, и я не был в состоянии сделать заказ случайным. Может быть, кто-то может продолжать с этим подходом. Это даст вам случайную строку в согласующих и широты LNG комбинаций, хотя.

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

Ответил 10/12/2008 в 03:42
источник пользователем

голоса
1

это не работает для вас?

select top (@maxcount) *
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat
) t 
order by newid()
Ответил 10/12/2008 в 12:29
источник пользователем

голоса
0

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

Ответил 10/12/2008 в 01:30
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more