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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top