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