2013-02-28 2 views
0

Данный стол с 2 колонкамиSQL запрос, чтобы найти самый популярный час

Name(type VARCHAR) Time(type DATETIME) 

Мне нужно написать запрос SQL, чтобы найти час с наибольшим количеством записей.

Например:

Name Time 
---- ---- 
a  12:30pm 
b  12:05pm 
c  13:55pm 
d  12:50pm 
e  01:02am 

Желаемый результат час: 12 вечер - 1 вечер

Моей общая идея заключается в:
1) Группа строки по часу
2) подсчет строк/группа
3) сортировать кол-во в порядке убывания
4) распечатать наибольшее кол-во

Мне нужна помощь в преобразовании этого в SQL-запрос.

+0

Какой тип вашей временной столбец? –

+0

DATETIME. Мы можем изменить тип на что-то еще, если это облегчит запрос. – user674669

+2

no datetime field is fine –

ответ

3

Это довольно просто ...

SELECT HOUR(Time) as Hr,COUNT(*) AS Cnt 
FROM MyTable 
GROUP BY Hour(Time) 
ORDER BY Cnt DESC 
LIMIT 1 

GROUP BY Hour(Time) - группа по часам

ORDER BY Cnt DESC - это делает его сортировку по кол-ву (в порядке убывания)

LIMIT 1 - как вы только нужен один верхний результат

+1

Поскольку он помечен также для Oracle, вам понадобится TRUNC вместо HOUR и использование ROWNUM и подзапроса вместо предложения LIMIT. – igr

+0

на самом деле помечены как mysql, так и oracle: /, поэтому синтаксис будет отличаться. этот правильный для mysql – poncha

+0

@poncha - используйте подходящий синтаксис, так как ваш запрос никогда не будет работать в Oracle. Вы можете только смутить OP. Это касается синтаксиса, а не кода. – Art

0

Это версия Oracle, в которой я понимаю, что вы ищете г для:

SELECT t_stamp 
    , MAX(count(t_stamp)) OVER (PARTITION BY t_stamp ORDER BY t_stamp) hits_per_hr_interval 
    FROM 
    (
    SELECT name, EXTRACT(hour From Cast(t_stamp as timestamp)) t_stamp 
    FROM stack_test 
) 
    GROUP BY t_stamp 
/

    T_STAMP HITS_PER_HR_INTERVAL 
    ------------------------------- 
    12   3 
    13   2 

ИЛИ используя row_number():

SELECT * FROM 
(
SELECT t_stamp 
     , Count(t_stamp) OVER (PARTITION BY t_stamp ORDER BY t_stamp) hits_per_hr_interval 
     , ROW_NUMBER() OVER (PARTITION BY t_stamp ORDER BY t_stamp) hr_seq 
    FROM 
    (
    SELECT EXTRACT(hour From Cast(t_stamp as timestamp)) t_stamp 
    FROM stack_test 
    ) 
) 
    -- WHERE hr_seq = 1 -- optional to see only first row per group as in above example 
/

T_STAMP HITS_PER_HR_INTERVAL HR_SEQ 
------------------------------------------ 
12   3      1 
12   3      2 
12   3      3 
13   2      1 
13   2      2 

Вы можете добавить несколько фильтров, как, где ваши часы составляет от 12 до 1 только ...

Смежные вопросы