Portál AbcLinuxu, 13. května 2025 00:54
identifikator skore
a 13
a 12
a 15
a 14
b 3
b 5
b 7
chci ji transformovat na tabulku, kde budou ponechany max 3 radky pro kazdy identifikator, ktere maji nejvetsi skore. Tedy aby "a 12"
bylo vyfiltrovano. Jde to nejak jednoduse?
(BTW Proc to chci: potrebuji totiz prumer 3 nejvetsich skore pro kazdy identifikator. Ano, to by asi slo primo pres nejakou agregacni funkci, ale ta defaultne nejspis neexistuje. Proto zkousim tabulku nejdrive vyfiltrovat a pak je to snadne.)
Řešení dotazu:
postgres=> select * from t; x | y ---+---- a | 13 a | 12 a | 15 a | 14 b | 3 b | 5 b | 7 (7 rows) postgres=> select x,y from (select rank() over(partition by x order by y desc), x, y from t) s where rank <= 3; x | y ---+---- a | 15 a | 14 a | 13 b | 7 b | 5 b | 3 (6 rows)Je to dobrá úloha na naučení se trochu netriviálního SQL (naučit se všechny varianty).
SELECT id, PRUMER_NEJVSSICH_TRI(skore) GROUP BY id;
SELECT t1.id, ( SELECT AVG(t2.skore) FROM ( SELECT t3.skore FROM t AS t3 WHERE t3.id = t1.id ORDER BY t3.skore DESC LIMIT 3 ) AS t2 ) AS prumer_3_nejvyssich FROM t as t1 GROUP BY t1.id ORDER BY t1.id
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.