Question

Problème: une table de coordonnées lat / GLE. 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 (dans l'ensemble de retour). Notez que n'est pas utilisable distinct parce que je dois retourner la colonne id qui est, par définition, distincte. Ce genre d'œuvres (le nombre est @maxcount de lignes dont nous avons besoin, une colonne est intid int id unique):

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

Il retourne toujours la même ligne pour une coordonnée donnée malheureusement, ce qui est peu dommage pour mon usage. Si seulement nous avions un agrégat que nous pourrions utiliser au lieu de rand() max() ... Notez que vous ne pouvez pas utiliser avec newid() GUIDs créé par <=>.

Toutes les idées? (Il y a un peu plus de fond ici, si vous êtes intéressé: http: // www .itu.dk / ~ friism / blog / p = 121 )

MISE À JOUR: Solution complète

Était-ce utile?

La solution

Vous pourriez être en mesure d'utiliser un CTE pour cela avec la fonction ROW_NUMBER à travers lat et long, puis utilisez rand () contre. 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)

retournera toujours les premiers ensembles de latitude et GLE et je n'ai pas été en mesure de faire l'ordre aléatoire. Peut-être que quelqu'un peut continuer avec cette approche. Il vous donnera une ligne aléatoire dans les combinaisons correspondantes lat et lng cependant.

Si j'ai plus de temps plus tard, je vais essayer de contourner ce dernier obstacle.

Autres conseils

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()

Où avez-vous eu l'idée que DISTINCT ne fonctionne que sur une colonne? Quoi qu'il en soit, vous pouvez également utiliser une clause GROUP BY.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top