rand SQL Server () agregada
-
21-08-2019 - |
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í
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.