我有一个网络应用程序,可让客户定义其服务的每日费率。对于任何给定的日期,客户可以输入两个费率,小时费率(rateTypeId = 1)和dailyRate(rateTypeId = 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语句,但不确定。我的结果每个日期应包含两行,类似于:
ID --- RATETYPEID --- RATECODE ---------- ENTRYTIMESTAMP ----- RATE
3 ----------- 1 --------------- 32 -------------------- 1200000000 ----------6.00
2 ----------- 2 --------------- 33 -------------------- 1100000000 ----------7.00
感谢您的任何建议。
答案 0 :(得分: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
答案 1 :(得分: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
我这里有一个很大的假设。也就是说,在费率表中,对于给定的日期和费率代码,entrytimestamps是唯一的。