zoukankan      html  css  js  c++  java
  • 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 中的偏移函数进行求解。

  • 相关阅读:
    赫尔维茨公式
    从解析几何的角度分析二次型
    Struts 1 Struts 2
    记一次服务器被入侵的调查取证
    契约式设计 契约式编程 Design by contract
    lsblk df
    Linux Find Out Last System Reboot Time and Date Command 登录安全 开关机 记录 帐号审计 历史记录命令条数
    Infrastructure for container projects.
    更新文档 版本控制 多版本并发控制
    Building Microservices: Using an API Gateway
  • 原文地址:https://www.cnblogs.com/hider/p/11746421.html
Copyright © 2011-2022 走看看