V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xx19941215
V2EX  ›  问与答

一道 sql 题目

  •  
  •   xx19941215 · 2019-01-31 09:09:56 +08:00 · 2232 次点击
    这是一个创建于 2141 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为何我使用的交叉连接无法通过?

    select distinct `w2`.`Id` from `Weather` `w1`, `Weather` `w2`
    where datediff(`w1`.`RecordDate`, `w2`.`RecordDate`) = 1
    and `w2`.`Temperature` >`w1`.`Temperature`;
    
    13 条回复    2019-01-31 14:39:24 +08:00
    hand515
        1
    hand515  
       2019-01-31 09:15:16 +08:00
    datediff(`w2`.`RecordDate`, `w1`.`RecordDate`) = 1

    应该是反了吧?
    1069401249
        2
    1069401249  
       2019-01-31 09:20:07 +08:00
    报什么错?我测试没问题啊
    xx19941215
        3
    xx19941215  
    OP
       2019-01-31 09:21:21 +08:00
    @hand515 哎呦 还真是 😂
    Vegetable
        4
    Vegetable  
       2019-01-31 09:24:06 +08:00
    弱弱的问一句这个语句时间复杂度是 O(N^2)吗?
    xx19941215
        5
    xx19941215  
    OP
       2019-01-31 09:26:38 +08:00
    @Vegetable cross join 就是笛卡尔积,理论上就是 O(N^2)吧 😂可能 inner join 复杂度会低点,还是我理解的都是错的?
    xx19941215
        6
    xx19941215  
    OP
       2019-01-31 09:29:03 +08:00
    @1069401249 你力扣提交试试 😁
    Vegetable
        7
    Vegetable  
       2019-01-31 09:58:24 +08:00
    @xx19941215
    我觉得这种解法看起来能快一些,不过 LeetCode 里 datediff 的更快.
    ```
    SELECT
    *
    FROM
    Weather AS a
    JOIN (SELECT * FROM Weather) AS b ON DATE_SUB(a.RecordDate, INTERVAL 1 DAY) = b.RecordDate
    WHERE
    a.Temperature > b.Temperature;

    ```
    xx19941215
        8
    xx19941215  
    OP
       2019-01-31 10:06:04 +08:00
    @Vegetable 我回头试试
    liprais
        9
    liprais  
       2019-01-31 10:11:23 +08:00 via iPhone
    @Vegetable mysql 不支持函数索引,所以这种写法要谨慎使用
    Vegetable
        10
    Vegetable  
       2019-01-31 10:12:38 +08:00
    @xx19941215 我试过了,的确是 datediff 快,10000 条数据的时候一个 10s 一个 15s
    mwiker
        11
    mwiker  
       2019-01-31 10:17:31 +08:00
    oracle 里支持窗口函数,用这种方式效率也不错

    SELECT Id
    FROM (
    select Id,Temperature,RecordDate,
    lag(RecordDate) over(order by RecordDate) as Last_RecordDate,
    lag(Temperature) over(order by RecordDate) as Last_Temperature
    from Weather)
    WHERE Temperature > Last_Temperature
    AND RecordDate - Last_RecordDate = 1
    wind3110991
        12
    wind3110991  
       2019-01-31 11:22:38 +08:00
    这个天气一看就是广州了 = =
    abusizhishen
        13
    abusizhishen  
       2019-01-31 14:39:24 +08:00
    试试把数据全拿出来,id 错一位比较温度再取 id 值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   898 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:35 · PVG 03:35 · LAX 11:35 · JFK 14:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.