1 votes

Veuillez traduire ceci en français en conservant les mêmes balises HTML si elles existent : Agrégat SQL Server rand()

Problème : un tableau de coordonnées lat/lng. Deux lignes peuvent potentiellement avoir la même coordonnée. Nous voulons une requête qui renvoie un ensemble de lignes avec des coordonnées uniques (au sein de l'ensemble retourné). Notez que distinct n'est pas utilisable car j'ai besoin de renvoyer la colonne id qui est, par définition, distincte. Cela fonctionne un peu (@maxcount est le nombre de lignes dont nous avons besoin, intid est une colonne d'identifiant int unique) :

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

Cela renverra toujours la même ligne pour une coordonnée donnée malheureusement, ce qui est un peu ennuyeux pour mon utilisation. Si seulement nous avions une agrégation rand() que nous pourrions utiliser à la place de max()... Notez que vous ne pouvez pas utiliser max() avec des ids guids créés par newid().

Des idées ? (il y a plus de contexte ici, si cela vous intéresse : http://www.itu.dk/~friism/blog/?p=121)

MISE À JOUR : Solution complète ici

2voto

Tom H. Points 23783

Vous pourriez être en mesure d'utiliser une CTE pour cela avec la fonction ROW_NUMBER à travers lat et long puis utiliser rand() contre cela. Quelque chose comme :

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)

Cela renverra toujours les premiers ensembles de lat et lng et je n'ai pas réussi à rendre l'ordre aléatoire. Peut-être que quelqu'un peut continuer avec cette approche. Cela vous donnera cependant une ligne aléatoire parmi les combinaisons lat et lng correspondantes.

Si j'ai plus de temps plus tard, j'essaierai de contourner ce dernier obstacle.

1voto

Mladen Prajdic Points 10337

Cela ne fonctionne pas pour vous?

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

0voto

Joel Coehoorn Points 190579

D'où viens-tu avec l'idée que DISTINCT ne fonctionne que sur une colonne? Quoi qu'il en soit, tu pourrais aussi utiliser une clause GROUP BY.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X