J'ai une table d'échantillonnage avec une structure et des données similaires, comme indiqué ci-dessous:
+------+---------+-------------+------------+ | S_ID | S_NAME | SUBJECT | MAX_MARK | +------+---------+-------------+------------+ | 3 | Stud | SUB_3 | 70 | | 5 | Stud_1 | SUB_2 | 50 | | 6 | Stud_2 | SUB_2 | 40 | +------+---------+-------------+------------+
5 Réponses :
Utilisez Row_Number () CODE>
select * from
(
select *,row_number() over(partition by s_name order by MARK_VALUE desc) as rn
from tablename
)A where rn=1
Utilisez Row_Number () CODE> Fonction de la fenêtre
select t1.* from table_name t1
where t.MARK_VALUE=(select max(MARK_VALUE) from table_name t2 where t2.S_NAME=t1.S_NAME)
fonction analytique Sélectionnez ensuite des lignes avec cette valeur de numéro de ligne. P> row_number code> peut être utilisé pour regrouper des lignes par
s_name code> (comme vous voulez avoir une marque maximale par élève) et trier les marques dans l'ordre décroissant de sorte que le max La valeur augmente au sommet (c.-à-d. obtient numéro de ligne em> = 1).
<snip>
9 select s_id, s_name, subject, mark_value
10 from test
11 where (s_name, mark_value) in (select s_name, max(mark_value) max_mark
12 from test
13 group by s_name);
S_ID S_NAME SUBJE MARK_VALUE
---------- ------ ----- ----------
3 stud sub_3 70
5 stud_1 sub_2 50
6 stud_2 sub_2 40
SQL>
S'il vous plaît essayez ceci.
Select B.* from @tbl AS B INNER JOIN( Select S_Name,MAX(MARK_VALUE) AS MARK_VALUE from @tbl Group by S_Name) AS A ON A.S_name=B.S_Name AND A.MARK_VALUE = B.MARK_VALUE
Vous pouvez utiliser groupe par code> et
garder code>:
garder code> est une extension Oracle qui permet fonctionnalité comme
first_value () code> et
last_value () code> pour les fonctions d'agrégation. Dans mon expérience, c'est assez rapide. P> p>