2009-09-03 7 views
4

私はクライアントが自分のサービスの1日の料金を定義できるようにするWebアプリケーションを持っています。任意の日に、クライアントは時間レート(rateTypeId = 1)とdailyRate(rateTypeId = 2)の2つのレートを入力できます。これらの料金は事前に割り当てられることが多く、頻繁に変更されます。私はすべての割り当てを追跡する必要がありますが、割り当てられた最新のレートだけを引き出します。max(timestamp)に基づくMysql参加

私は2つのテーブルを持っています。最初の表は、単純に私の料金体系を定義し、この(簡体字)のようになります。

表:RateDefinitions

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

私の第二の表は、与えられた日付に割り当てられた率を追跡します。特定の日付に複数のレートを割り当てることができますが、「エントリータイムスタンプ」に基づく最新のレートのみを使用します。

表:料金

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 
をしかし、それはそれを行うことはないだろう。私はsubselectステートメントに参加する必要があると思っていますが、わかりません。結果は、日付ごとに2行含まれている必要があります。

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

感謝。ここの理論がこの問題の解決に役立った。 – user167850

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 

私の部分で、ここでは大きな前提があります。つまり、レートテーブルでは、特定の日付とレートコードに対して、エントリタイムスタンプが一意です。

関連する問題