Domanda

Problema: una tabella di coordinate lngs lat /. Due righe possono potenzialmente avere la stessa coordinata. Vogliamo una query che restituisce un set di righe con coordinate unici (all'interno del set restituita). Si noti che non è utilizzabile distinct perché devo riportare la colonna id che è, per definizione, distinto. Questo tipo di lavori (@maxcount è il numero di righe di cui abbiamo bisogno, intid è una colonna int ID univoco):

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

Sarà sempre tornare sulla stessa riga per una data coordinata purtroppo, che è po 'un peccato per il mio uso. Se solo avessimo un aggregato rand() potremmo usare al posto di max() ... Si noti che non è possibile utilizzare newid() con GUID creati da <=>.

Tutte le idee? (C'è ancora un po 'di fondo qui, se siete interessati: http: // www .itu.dk / ~ friism / blog /? p = 121 )

UPDATE: soluzione completa qui

È stato utile?

Soluzione

Si potrebbe essere in grado di utilizzare un CTE per questo con la funzione ROW_NUMBER attraverso lat e lunga e quindi usare rand () contro quello. Qualcosa di simile:

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)

Questo sarà sempre tornare i primi gruppi di lat e LNGS e non sono stato in grado di fare l'ordine casuale. Forse qualcuno può continuare con questo approccio. Vi darà una riga casuale all'interno delle corrispondenti combinazioni lat e di GNL però.

Se ho più tempo in seguito cercherò di aggirare questo ultimo ostacolo.

Altri suggerimenti

questo non funziona per voi?

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

Dove hai preso l'idea che DISTINCT funziona solo su una colonna? In ogni caso, si potrebbe anche usare una clausola GROUP BY.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top