2009-09-03 125 views
4

我有一個web應用程序,它可以讓客戶爲他們的服務定義每日費率。對於任何給定的一天,客戶可以輸入兩個費率,一個小時費率(rateTypeId = 1)和一個dailyRate(rateTypeId = 2)。這些費率通常是預先分配的,而且通常會改變。我需要跟蹤所有的作業,但只能提取最新的分配率。基於max的Mysql連接(時間戳)

我有兩個表。第一個表只是定義我的費率結構,看起來像這樣(簡化):

表:RateDefinitions

RATECODE ----- RATE 
31 ---------------- 5.00 
32 ---------------- 6.00 
33 ---------------- 7.00 

我的第二個表跟蹤分配給指定的日期的利率。可以將多個費率分配給給定日期,但我們只會使用基於'entrytimestamp'的最新費率。

表:價格

ID --- RATETYPEID --- RATECODE ------ DATE -------- ENTRYTIMESTAMP 
1 ---------- 1 --------------- 31 ---------- 20091010 ---------- 1100000000 
2 ---------- 2 --------------- 33 ---------- 20091010 ---------- 1100000000 
3 ---------- 1 --------------- 32 ---------- 20091010 ---------- 1200000000 

現在我有困難組建一個查詢,將拉動所有給定的時間內最新的速率分配。

我已經試過:

select r.id, r.rateTypeId, r.rateCode, max(r.entryTimestamp), rd.rate 
from rates r 
join rateDefinitions rd 
on r.rateCode=rd.rateCode 
where date=20091010 
group by startDate, rateTypeId 

但是這並不打算這樣做。我想我需要在子選擇語句上加入,但不確定。我的結果應該包含兩行每日期,類似於:

ID --- RATETYPEID --- RATECODE ---------- ENTRYTIMESTAMP ----- RATE 
3 ----------- 1 --------------- 32 -------------------- 1200000000 ----------6.00 
2 ----------- 2 --------------- 33 -------------------- 1100000000 ----------7.00 

感謝您的任何建議。

回答

2

這個問題相當普遍。您需要一個子查詢來拋出最大時間戳和ratetypeid(這是分組的基礎),然後從該子查詢行的內部連接和其他所有內容中選擇其他所有內容。

對於MySQL:

SELECT ratecode, rate, id, ratetypeid, date, entrytimestamp 

FROM ratedefinitions, 
(SELECT ratetypeid, MAX(entrytimestamp) AS max_timestamp FROM Rates 
GROUP BY ratetypeid) AS inner_table 

WHERE 

inner_table.ratetypeid = ratetypeid 
AND innertable.max_timestamp = timestamp 
+0

感謝深紅和Doug海耶斯。這裏的理論幫助解決了這個問題。 – user167850 2009-09-03 14:59:48

0

我推薦一個子查詢:

select r.id, r.rateTypeId, r.rateCode, max(r.entryTimestamp), rd.rate 
from 
rateDefinitions rd, 
rate r, 
    (select 
     rateCode, max(entryTimestamp) maxEntryTimestamp 
    from 
     rate 
    where date=20091010 
    group by rateCode) latestRates 

where r.rateCode=rd.rateCode AND 
    r.rateCode = latestRates.rateCode AND 
    r.entryTimestamp = latestRates.maxEntryTimestamp 
group by startDate, rateTypeId 

有一個重要的假設在這裏我的一部分。那就是在費率表中,對於給定的日期和費率代碼,輸入時間戳是唯一的。