Ho tabella t_stats
con colonna id (INT)
e colonna ratio (DECIMAL(8,4))
. id
è unico.Selezionare gruppi distinti di righe in base alla media
Voglio interrogare la tabella t_stats
per selezionare 3 gruppi con lo stesso AVG(ratio)
(il più vicino possibile).
Può essere eseguito utilizzando tabelle temporanee, purché sia possibile eseguirlo come script o stored procedure.
EDIT: Ecco l'esempio concreto:
INPUT:
id ratio
-- -----
24 0.930000
25 0.390000
26 0.800000
27 0.920000
28 0.550000
30 0.810000
31 0.770000
32 0.800000
33 0.590000
36 0.760000
37 0.910000
40 0.690000
43 0.390000
45 0.310000
46 0.760000
47 0.710000
54 0.710000
55 0.950000
57 0.920000
60 0.890000
62 0.700000
66 0.890000
68 0.950000
107 0.760000
559 0.990000
560 0.540000
565 0.430000
566 0.830000
568 0.590000
579 0.970000
599 0.900000
623 0.450000
749 0.800000
750 0.970000
753 0.820000
754 0.730000
766 0.620000
768 0.430000
770 0.790000
838 0.700000
875 0.835000
987 0.900000
988 0.740000
1157 0.850000
1250 0.630000
1328 0.860000
2171 0.900000
2176 0.520000
2177 0.980000
2178 0.940000
2180 0.970000
2184 0.990000
2187 0.950000
2188 0.940000
2189 0.920000
2195 0.990000
2233 0.900000
2234 0.940000
2235 0.950000
2240 0.980000
2243 0.920000
2253 0.900000
2266 0.530000
2269 0.920000
2270 0.970000
2271 0.750000
2272 0.820000
2275 0.910000
2277 0.930000
2281 0.690000
2282 0.710000
2288 0.840000
2528 0.870000
2778 0.950000
2814 0.990000
USCITA:
groupId id ratio
------- -- -----
1 24 0.930000
1 25 0.390000
1 27 0.920000
1 30 0.810000
1 32 0.800000
1 36 0.760000
1 54 0.710000
1 60 0.890000
1 559 0.990000
1 560 0.540000
1 566 0.830000
1 568 0.590000
1 623 0.450000
1 750 0.970000
1 838 0.700000
1 987 0.900000
1 1157 0.850000
1 2178 0.940000
1 2180 0.970000
1 2253 0.900000
1 2269 0.920000
1 2271 0.750000
1 2281 0.690000
1 2778 0.950000
1 2814 0.990000
2 26 0.800000
2 28 0.550000
2 31 0.770000
2 40 0.690000
2 45 0.310000
2 55 0.950000
2 57 0.920000
2 66 0.890000
2 107 0.760000
2 565 0.430000
2 579 0.970000
2 753 0.820000
2 754 0.730000
2 766 0.620000
2 875 0.835000
2 1328 0.860000
2 2176 0.520000
2 2177 0.980000
2 2184 0.990000
2 2187 0.950000
2 2189 0.920000
2 2233 0.900000
2 2234 0.940000
2 2275 0.910000
2 2282 0.710000
3 33 0.590000
3 37 0.910000
3 43 0.390000
3 46 0.760000
3 47 0.710000
3 62 0.700000
3 68 0.950000
3 599 0.900000
3 749 0.800000
3 768 0.430000
3 770 0.790000
3 988 0.740000
3 1250 0.630000
3 2171 0.900000
3 2188 0.940000
3 2195 0.990000
3 2235 0.950000
3 2240 0.980000
3 2243 0.920000
3 2266 0.530000
3 2270 0.970000
3 2272 0.820000
3 2277 0.930000
3 2288 0.840000
3 2528 0.870000
quindi voglio fare 3 gruppi di n
valori e puntare un valore medio specifico x
. (Esempio con n=30
e 0.75 < x < 0.85
apparirebbe come 3 gruppi di 30 valori ogni dove ogni gruppo ha 0.75 < AVG(ratio) < 0.85
e un id
può appartenere solo a 1 gruppo).
Così media è quasi uguale in ogni gruppo, e vicino a x
:
groupId avg(ratio)
------- ----------
1 0.805600
2 0.789000
3 0.797600
Questo è come il problema del Commesso viaggiatore. Dovresti confrontare tutte le combinazioni e scegliere il migliore. E per dataset di dimensioni anche moderate è un numero enorme di combinazioni! A meno che tu non sia felice di fare una stima ingenua? * [Ordina per dimensione, righe 1-3 vai a gruppi 1-3, quindi righe 4-6 vai a gruppi 1-3, ecc, ecc.] * – MatBailie
Al momento questo è quello che uso. Ma speravo in una soluzione meno ingenua. –
È necessario esaminare gli algoritmi di ottimizzazione. SQL non è come l'ambiente migliore. – MatBailie