rand SQL Server () agregado

votos
1

Problema: uma tabela de coordenar longitudes / lat. Duas fileiras pode, potencialmente, ter a mesma coordenada. Queremos uma consulta que retorna um conjunto de linhas com coordenadas únicas (dentro do conjunto retornado). Note que distinctnão é utilizável porque eu preciso para retornar a coluna id que é, por definição, distinta. Este tipo de obras ( @maxcounté o número de linhas que precisamos, intidé uma coluna única id int):

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

Será sempre retornar a mesma linha para uma determinada coordenada, infelizmente, o que é pouco de vergonha para meu uso. Se tivéssemos um rand()agregado poderíamos usar em vez de max()... Note que você não pode usar max()com guids criados por newid().

Alguma ideia? (há um pouco mais fundo aqui, se você estiver interessado: http://www.itu.dk/~friism/blog/?p=121 )

UPDATE: solução completa aqui

Publicado 10/12/2008 em 01:22
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

Você pode ser capaz de usar uma CTE para isso com a função ROW_NUMBER através lat e longo e, em seguida, usar rand () contra isso. Algo como:

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)

Isso sempre vai retornar os primeiros conjuntos de lat e longitudes e eu não tenho sido capaz de fazer a ordem aleatória. Talvez alguém pode continuar com esta abordagem. Ele lhe dará uma linha aleatória dentro das combinações lat e lng correspondentes embora.

Se eu tiver mais tempo depois eu vou tentar contornar esse último obstáculo.

Respondeu 10/12/2008 em 03:42
fonte usuário

votos
1

isso não funciona para você?

select top (@maxcount) *
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat
) t 
order by newid()
Respondeu 10/12/2008 em 12:29
fonte usuário

votos
0

De onde você tirou a idéia de que DISTINCT só funciona em uma coluna? De qualquer forma, você também pode usar uma cláusula GROUP BY.

Respondeu 10/12/2008 em 01:30
fonte usuário

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