• LeetCode:197.上升的温度


    题目链接:https://leetcode-cn.com/problems/rising-temperature/

    题目

    给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。

    +---------+------------------+------------------+
    | Id(INT) | RecordDate(DATE) | Temperature(INT) |
    +---------+------------------+------------------+
    | 1 | 2015-01-01 | 10 |
    | 2 | 2015-01-02 | 25 |
    | 3 | 2015-01-03 | 20 |
    | 4 | 2015-01-04 | 30 |
    +---------+------------------+------------------+
    例如,根据上述给定的 Weather 表格,返回如下 Id:

    +----+
    | Id |
    +----+
    | 2 |
    | 4 |
    +----+

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/rising-temperature
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解答

    第一感觉,用 oracle 中的分析函数,偏移函数 laglead,不过不知道这里支不支持窗口函数,测试一番再说。

    ---- oracle ----
    /* Write your PL/SQL query statement below */
    select Id
    from
    (
        select Id,
               RecordDate,
               Temperature,
               lag(Temperature,1) over(order by RecordDate) as Temperature_2
        from Weather
    )
    where Temperature > Temperature_2;
    

    测试用例不通过,因为有一个测试用例是中间间隔了1天,并非前后2天,所以这道题不能通过偏移函数来进行求解,还是得通过前后2天进行连接,如果找不到对应的时间差则关联不上,这样的答案才是正确的。

    MySQL 环境中,使用 joindatediff 函数进行求解。

    ---- MySQL ----
    select a.Id as Id
    from Weather a
    left join Weather b
    on datediff(a.RecordDate, b.RecordDate) = 1
    where a.Temperature > b.Temperature; ---- 274ms
    -- 第一次提交的时候把最后温度的过滤条件写成了and,怪不得提交不通过,改为where之后便可以了。
    
    ---- MySQL ----
    # Write your MySQL query statement below
    select a.Id
    from Weather a,
         Weather b
    where a.Temperature > b.Temperature
    and datediff(a.RecordDate, b.RecordDate) = 1; ---- 275ms
    

    这样子就通过?得好好考虑一下。。

    ---- oracle ----
    /* Write your PL/SQL query statement below */
    select a.Id as Id
    from Weather a
    left join Weather b
    on a.RecordDate = b.RecordDate - 1
    where a.Temperature > b.Temperature; 
    ---- 没通过
    

    其实本身,这样子的解法是没有问题的,只是测试样例中的数据不够规范,所以测试才不通过。

    另外,果然看到一种通过偏移函数解答的,再进行尝试一番,修改一下。

    ---- oracle ----
    /* Write your PL/SQL query statement below */
    select t.Id as Id
    from
    (
        select Id,
               RecordDate,
               Temperature,
               lag(Temperature,1) over(order by RecordDate) as Temperature_2,
    		   lag(RecordDate,1) over(order by RecordDate) as RecordDate_2
        from Weather
    ) t
    where t.Temperature > t.Temperature_2
    and round(to_number(t.RecordDate - t.RecordDate_2)) = 1; ---- 537ms
    

    证明,偏移函数还可以可以的!!!

    思考

    复习一下 MySQLdatediff 函数。

    第一个参数减掉第二个参数。

    datediff('2007-12-31','2007-12-30');   # 1
    datediff('2010-12-30','2010-12-31');   # -1
    

    另外,也可以通过 date_add 函数进行时间加减。

    date_add('2019-10-26', interval 1 day)
    

    使用 oracle 中的偏移函数进行求解。

  • 相关阅读:
    mysql性能调优与架构设计(一)商业需求与系统架构对性能的影响
    Android发送数据到web服务器4种方式
    Java 操作mongodb
    父子容器互相操作的方法
    Sql Server中查询当天,最近三天,本周,本月,最近一个月,本季度的数据的sql语句
    js实现多少秒后自动跳转
    插入数据返回插入的主键Id
    日期比较
    Cookie的增删改查
    js标准化价钱
  • 原文地址:https://www.cnblogs.com/hider/p/11746421.html
Copyright © 2020-2023  润新知