2013-02-28 35 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

是什麼類型的時間列? – 2013-02-28 11:57:27

+0

DATETIME。如果查詢更容易,我們可以將其類型更改爲其他類型。 – user674669 2013-02-28 12:01:03

+2

沒有日期時間字段很好 – 2013-02-28 12:02:17

回答

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 2013-02-28 12:25:30

+0

它實際上標記爲mysql和oracle:/所以語法會有所不同。這是一個正確的mysql – poncha 2013-02-28 12:37:12

+0

@poncha - 請使用適當的語法,因爲您的查詢將永遠不會在Oracle中工作。您可能只會混淆OP。這是關於語法而不是代碼。 – Art 2013-02-28 14:26:48

0

這是Oracle版本,在我的理解你看起來是什麼g下:

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之間的過濾器...