2010-04-26 4 views
1

J'ai une table avec l'historique des changements avec emp ids.Sélectionnez count() max() Date

J'utilise cette requête pour récupérer une liste des employés et leur quart de travail au total en spécifiant la plage à compter de:

SELECT ope_id, count(ope_id) 
FROM operator_shift 
WHERE ope_shift_date >=to_date('01-MAR-10','dd-mon-yy') and ope_shift_date 
<= to_date('31-MAR-10','dd-mon-yy') 
GROUP BY OPE_ID 

qui donne

OPE_ID  COUNT(OPE_ID) 
    1   14 
    2    7 
    3    6 
    4    6 
    5    2 
    6    5 
    7    2 
    8    1 
    9    2 
    10    4 

10 lignes sélectionnées. Comment puis-je choisir l'employé avec le nombre le plus élevé de quarts de travail dans la plage de dates spécifiée?

+0

10g express oracle im en utilisant –

Répondre

1

Si l'on suppose votre version d'Oracle est assez nouveau pour soutenir les expressions de table commune:

With ShiftCounts As 
    (
    SELECT ope_id, count(ope_id) ShiftCount 
     , ROW_NUMBER() OVER(ORDER BY Count(ope_id) Desc) ShiftRank 
    FROM operator_shift 
    WHERE ope_shift_date >=to_date('01-MAR-10','dd-mon-yy') 
     and ope_shift_date <= to_date('31-MAR-10','dd-mon-yy') 
    GROUP BY OPE_ID 
    ) 
Select ope_id, ShiftCount 
From ShiftCounts 
Where ShiftRank = 1 
+0

Wow jamais attendu, je nai pas été enseignés sur les rangs encore. .. –

+0

c'est parfait ça fonctionne comme un charme merci beaucoup –

+0

@DAVID: ROW_NUMBER, RANK, DENSE_RANK et NTILE sont des fonctions analytiques, supportées depuis Oracle 9i. –

0

quelque chose comme ça peut-être:

SELECT TOP 1 ope_id, Count(ope_id) 
FROM operator_shift 
WHERE ope_shift_date >=to_date('01-MAR-10','dd-mon-yy') and ope_shift_date 
<= to_date('31-MAR-10','dd-mon-yy') 
GROUP BY OPE_ID 
ORDER BY Count(ope_id) DESC 
+0

'top' est pas pris en charge par Oracle - SQL Server, ne sachant pas si Informix ne trop ... –

0

Utilisation:

SELECT t.ope_id, 
     t.num 
    FROM (SELECT os.ope_id, 
       COUNT(os.ope_id) AS num 
      FROM OPERATOR_SHIFT os 
     WHERE os.ope_shift_date BETWEEN TO_DATE('01-MAR-10','dd-mon-yy') 
            AND TO_DATE('31-MAR-10','dd-mon-yy') 
     GROUP BY os.ope_id 
     ORDER BY num DESC) t 
WHERE ROWNUM = 1 

Référence:

+0

merci aussi cela fonctionne aussi, wow –