2014-07-11 36 views
1

我想在給定小時內獲得最高記錄的amountSQL在給定小時內獲得最高金額的記錄

數據在DB:

id | date    | amount 
––––––––––––––––––––––––––––––––– 
1 | 2014-07-11 18:10:00 | 10 
2 | 2014-07-11 18:20:00 | 20 
3 | 2014-07-11 18:30:00 | 100 
4 | 2014-07-11 18:40:00 | 10 
5 | 2014-07-11 19:10:00 | 50 
6 | 2014-07-11 19:20:00 | 60 

期望的結果:

id | date    | amount 
--------------------------------- 
3 | 2014-07-11 18:30:00 | 100 
6 | 2014-07-11 19:20:00 | 60 
+0

你試過了什麼?日期列的數據類型是什麼? – MJB

+0

日期列是datetime數據類型。 –

+0

爲什麼你需要返回ID?這是一個沒有ID的非常微不足道的問題,但是您需要解釋業務規則,以便了解在同一時間段內綁定金額並且您希望返回ID時應該執行的操作。如果你希望它們都返回一行(同一小時不止一次列出),則sgeddes的查詢可以工作。 –

回答

4

如果我正確理解你的問題,你可以加入表背本身使用的最大骨料,按小時和日期分組到:

select d.* 
from data d 
    join (select max(amount) maxamount, hour(date) datehour, date(date) date 
     from data 
     group by hour(date), date(date) 
     ) d2 on d.amount = d2.maxamount 
      and hour(d.date) = d2.datehour 
      and date(d.date) = d2.date 
+0

不錯的查詢:)好像它會很慢,雖然當你有一個大桌子,因爲多個連接條件 –

+0

這是一個有趣的OP給了我們。我剛剛嘗試過您的查詢並得到'無法重新打開表格d'。 – user3741598

+0

糟糕。我的錯。我創建了一個臨時表,因此違反規則來引用它> 1。 – user3741598

2

這樣的事情? - 假設表名是交易

SELECT 
    * 
FROM 
(
    SELECT 
     id, date, amount 
    FROM transactions 
    ORDER BY amount DESC 
) AS t 
GROUP BY HOUR(date) , DATE(date); 

WORKING FIDDLE

+0

不會因爲沒有按ID分組而給出錯誤嗎? – MJB

+0

不,它不會我已經測試過它。 –

+0

但是你的結果仍然不像OPs Desired Outcome。它只能找到金額 - 而不是id,並且不會指出該金額用於哪個小時。 – MJB

1

這應該足夠了:

SELECT  Id, 
      Dating, 
      Amount 
FROM  Tab 
WHERE  Amount IN (SELECT  MAX(Amount) AS 'Maximum Amount' 
         FROM   Tab 
         GROUP BY  HOUR(Dating), DATE(Dating)) 

你可以看到這裏 - >SQL Fiddle Demo

希望這有助於!

+1

這是一個不正確的答案。你的編號不匹配 –

+0

@JohnRuddell謝謝你指出。我的錯!!我編輯了我的答案。這個確實顯示正確的ID。看看小提琴。 –

+0

這會有另一個問題,就像一個fyi ..當你查看多天時,數據仍然會按小時編號分組,因此您需要添加'GROUP BY HOUR(約會),DATE(約會)' –

2

您也可以與not exists辦法接近這個:

select d.* 
from data d 
where not exists (select 1 
        from data d2 
        where date(d2.date) = date(d.date) and 
         hour(d2.date) = hour(d.date) and 
         d2.amount > d.amount 
       ); 

這僅僅是一個替代的解決方案。有時not existsgroup byjoin快,但可能不是這種情況。