Pregunta

Problema: una tabla de coordenadas de latitud LNG /. Dos filas pueden llegar a tener la misma coordenada. Queremos una consulta que devuelve un conjunto de filas con coordenadas únicas (dentro del conjunto devuelto). Tenga en cuenta que distinct no es utilizable porque necesito volver columna id que es, por definición, distinta. Este tipo de obras (@maxcount es el número de filas que necesitamos intid, es una columna única int id):

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

Es siempre devolverá la misma fila para una coordenada dada por desgracia, que es un poco de vergüenza para mi uso. Si sólo tuviéramos un agregado rand() podríamos utilizar en lugar de max() ... Tenga en cuenta que no se puede utilizar con newid() guids creados por <=>.

¿Alguna idea? (Hay algo más de fondo aquí, si usted está interesado: http: // www .itu.dk / ~ friism / blog /? p = 121 )

ACTUALIZACIÓN: solución completa aquí

¿Fue útil?

Solución

Usted puede ser capaz de utilizar un CTE para esto con la función ROW_NUMBER través lat y largo y luego usar rand () en contra de eso. Algo así 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)

Esto siempre devolverá los primeros conjuntos de lat y LNG y no he sido capaz de hacer que el orden aleatorio. Tal vez alguien pueda seguir adelante con este enfoque. Se le dará una fila al azar dentro de las combinaciones que coinciden lat y lng sin embargo.

Si tengo más tiempo más adelante voy a tratar de conseguir alrededor de ese último obstáculo.

Otros consejos

esto no funciona para usted?

select top (@maxcount) *
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat
) t 
order by newid()

¿De dónde sacó la idea de que distintas sólo funciona en una columna? De todos modos, también se puede utilizar una cláusula GROUP BY.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top