SQL Server rand () agregado
-
21-08-2019 - |
Pergunta
Problema: uma tabela de coordenadas lat / longitudes. 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-se que distinct
nã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 int id único):
select top (@maxcount) max(intid)
from Documents d
group by d.geoLng, d.geoLat
Será sempre retornar o mesmo registro para uma determinada coordenada, infelizmente, o que é pouco de vergonha para meu uso. Se tivéssemos um rand()
agregar poderíamos usar em vez de max()
... Note que você não pode usar max()
com guids criados por newid()
.
Todas as idéias? (Há um pouco mais fundo aqui, se você estiver interessado: http: // www .itu.dk / ~ friism / blog /? p = 121 )
UPDATE: solução completa aqui
Solução
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)
Esta será sempre 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 da correspondência lat e lng combinações embora.
Se eu tiver mais tempo depois eu vou tentar contornar esse último obstáculo.
Outras dicas
Isto 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()
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.