如何在搜索上一个日期时加快SQL速度?

问题描述 投票:1回答:1

表t1有200k条记录,前几条记录是:

 -----------------------------
 |    date   |  id    | value |
 -----------------------------
 | 2/28/2019 |  abc1    | 55  |
 | 2/28/2019 |  abc2    | 44  |
 | 2/28/2019 |  abc3    | 33  |
 | 2/26/2019 |  abc1    | 22  |
 | 2/26/2019 |  abc2    | 12  |
 | 2/25/2019 |  abc1    | 11  |
 | 2/25/2019 |  abc3    | 10  |
 | 2/24/2019 |  abc1    | 10  |
 | 2/24/2019 |  abc2    | 10  |
 -----------------------------

我想从t1获取abc1,然后找到前一个日期的abc1值(可以是-1天或-2天或-3天......但是在过去的5天内肯定会是这样)并显示差异(值第一个日期 - 上一个日期的值)。

我创建了一个可以正常工作的查询(但速度很慢):

select 
    a.date, a.id, a.value, b.value, a.value-b.value
from 
    t1 a
inner join 
    t1 b
on 
    a.id = b.id
where 
    b.date = (
        select 
            max(date) from t1
            where 
                date < a.date
                and date > dateadd(day, -5, a.date)
    )

这工作正常,但200K记录(需要几分钟)非常慢。

如何加快速度? (也许使用RANK或其他一些更有效的方法..)

期待结果:

2/28/2019 | abc1 | 33     (which is "55 - 22")
2/28/2019 | abc2 | 32     (which is "44 - 12")
2/28/2019 | abc3 | 23     (which is "33 - 10")

谢谢!

sql snowflake
1个回答
2
投票

使用lag()

select t1.*,
       value - lag(value) over (partition by id order by date)
from t1;

无论您使用何种数据库,都应该能够利用(id, date, value)上的索引。

如果要将此限制为前五天,请使用case逻辑:

select t1.*,
       (case when date < dateadd(day, 5, lag(date) over (partition by id order by date))
             then value - lag(value) over (partition by id order by date)
        end)
from t1;
© www.soinside.com 2019 - 2024. All rights reserved.