2010-04-26 3 views
1

У меня есть таблица со сменой истории вместе с emp ids.Выберите count() max() Дата

Я использую этот запрос, чтобы получить список сотрудников и их общих сдвигов, указав диапазон сосчитать от:

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 

который дает

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 строк, выбранных.

Как выбрать сотрудника с наибольшим количеством смен в пределах указанной даты диапазона?

+0

10g выразить оракул им с помощью – 2010-04-26 20:54:37

ответ

1

Предполагая, что ваша версия Oracle является достаточно новой для поддержки общих табличных выражений:

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 никогда не ожидал этого, я нету преподавал о рангах еще. .. – 2010-04-26 20:59:47

+0

это прекрасно работает как шарм, спасибо большое – 2010-04-26 21:00:15

+0

@DAVID: ROW_NUMBER, RANK, DENSE_RANK и NTILE являются аналитическими функциями, поддерживаемыми с Oracle 9i. –

0

что-то вроде этого, может быть:

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' не поддерживается Oracle - SQL Server, не зная, если Informix делает тоже ... –

0

Использование:

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 

Ссылка:

+0

спасибо, что это тоже работает, ничего себе – 2010-04-26 21:10:50