2011-05-26 45 views
9

我試圖做一個查詢,每hour提取數據,而不是按小時正常組我想縮小它,只得到latest小時 - 意思是那個小時內的最新數據。下面顯示的圖片是我想要得到的是帶有紅色框的行。如果你會注意到,第一個紅色的行是10:59:51,這意味着它是唯一的行在10:00:0010:59:59之內。對於12:00及以上的其餘行,我想獲得12:37:14,因爲它是該小時範圍內的最新或最新版本。MySQL:如何每小時分組數據並獲得最新的小時數

enter image description here

我使用HOUR()這樣的組由hour數據的簡單查詢:

SELECT userid, username, date_created 
FROM user_accounts 
WHERE date_created >= '2009-10-27 00:00:00' AND date_created < '2009-10-27 23:59:59' 
GROUP BY HOUR(date_created) 

查詢,但是,僅僅是按小時1012返回ID 24和分組它25 - 但我需要的是ID2428。有任何想法嗎?

+0

也嘗試與我的答案;它是優化的 – diEcho 2011-05-26 11:35:12

回答

19

嘗試

SELECT f.* 
FROM (
     SELECT MAX(UNIX_TIMESTAMP(date_created)) AS mts 
     FROM user_accounts 
     GROUP BY HOUR(date_created) 
     ) s 
JOIN user_accounts f 
ON  UNIX_TIMESTAMP(date_created) = s.mts 
WHERE DATE(date_created) = '2009-10-27' 
+1

完美解決方案@diEcho ... Thankx – AndroidDanger 2011-05-26 11:26:48

+0

這隻返回'2009-10-27'只有一行,而不是我所期望的。 – tradyblix 2011-05-26 12:28:18

+0

@trady blix,你檢查過嗎?我已經測試過它 – diEcho 2011-05-26 12:29:25

5

也許這會工作?

SELECT userid, username, date_created 
FROM user_accounts 
WHERE userid IN (
    SELECT MAX(userid) 
    FROM user_accounts 
    WHERE date_created >= '2009-10-27 00:00:00' AND date_created < '2009-10-27 23:59:59' 
    GROUP BY HOUR(date_created) 
) 
+0

+1秒打敗我:) – 2011-05-26 10:32:19

+0

你不能假設MAX(id)意味着MAX(date_created),尤其是當你可以只使用MAX(date_created)而不需要嵌套查詢! – GordyD 2011-05-26 10:38:19

+0

太棒了!我從來沒有想過使用子選擇,並且通過使用'MAX',您實際上可以在分組的'HOUR(date_created)'中獲得最高的ID。我試過這個,它的工作原理,謝謝! :) – tradyblix 2011-05-26 11:00:47

0

你從現在的意思是一小時或最新整整一個小時? 如果它是最新的整小時這樣可能工作?

SELECT userid, username, date_created 
FROM user_accounts 
WHERE HOUR(date_created) = (SELECT HOUR(date_created) FROM user_accounts ORDER BY date_created DESC LIMIT 1); 

編輯: 唉唉,現在我覺得我得到你想要的...您的日期範圍之間的每給定小時,最後添加的項目嗎?

如果是這樣,那麼Codler的查詢就是你想要的。

1

如果跨越多天,我將不得不假設你也希望它一天,否則一個小時的max()可能會給你一些東西,從一個星期前一個小時到三天前另一個小時,以及當前日子還有另一個......如果你跨越WHERE子句之外的所有東西,特別限制在你的單日範圍內。它不是通過你想要的特定用戶,而是那個在那個小時進行最後一次活動的人......可能是同一個人,每次都可能完全不同。我又在特定日期黏合我的組測試的一部分,以防萬一你曾經想跨越的日期範圍,但你可以把它拿出來太...

select STRAIGHT_JOIN 
     ui.userid, 
     ui.username, 
     ui.date_created 
    from 
     (select 
       date(date_created), 
       hour(date_created), 
       max(date_created) as LastPerHour 
      from 
       user_accounts 
      where 
       date(date_created) = '2009-10-27' 
      group by 
       date(date_created), 
       hour(date_created)) PreQuery 
     join user_accounts ui 
     on PreQuery.LastPerHour = ui.date_created 

,我已經包含日期作爲一個分組,如果你想跨越多天,只要確保你的表在date_created上有一個索引本身......或者至少在索引的第一個位置。

+0

我實際上只是單純地使用'MAX'而生活,但是我已經測試了它並且工作,我感謝你的回答。我會在需要的時候提及您的解決方案。 +1 :) – tradyblix 2011-05-26 11:02:57

+0

@tradyblix,是的,我也喜歡另一種解決方案,即每小時只使用最大用戶ID ......但這隻能提供(與您的數據一樣)所涉及的列是自動增量。現在,如果您正在嘗試查找某人正在做某事的最後時間,例如LOG歷史記錄,其中用戶1是給定小時內的最後一位用戶,而用戶是25,那麼這將是您的解決方案...我希望您瞭解不同的上下文爲什麼一個查詢與另一個。 – DRapp 2011-05-26 11:19:26

0

我用這個解決方案

select date(PROCESS_DATE),hour(PROCESS_DATE),EVENT,COUNT(*) from statistics group by EVENT,date(PROCESS_DATE),time(PROCESS_TIME) order by 1 desc, 2 desc limit 1; 

希望這有助於別人。