【问题标题】:Mysql join based on max(timestamp)Mysql join 基于 max(timestamp)
【发布时间】:2010-11-25 07:19:19
【问题描述】:

我有一个网络应用程序,可以让客户为其服务定义每日费率。对于任何一天,客户可以输入两个费率,一个小时费率 (rateTypeId=1) 和一个每日费率 (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

但那是行不通的。我想我需要一个子选择语句的连接,但不确定。我的结果每个日期应该包含两行,类似于:

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

感谢您的任何建议。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这个问题相当普遍。您需要一个子查询来抛出最大时间戳和 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
    

    【讨论】:

    • 感谢 Crimson 和 Doug Hayes。这里的理论帮助解决了这个问题。
    【解决方案2】:

    我推荐一个子查询:

    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
    

    我有一个很大的假设。也就是说,在费率表中,对于给定的日期和费率代码,入口时间戳是唯一的。

    【讨论】:

      猜你喜欢
      • 2017-03-03
      • 2011-12-19
      • 2015-05-24
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多