【发布时间】:2020-08-12 21:40:06
【问题描述】:
亲爱的,我有一张这样的桌子:
day Cases
29/04/2020 1123
28/04/2020 1090
27/04/2020 908
我想获取过去 2 天的病例数之间的差异。
【问题讨论】:
亲爱的,我有一张这样的桌子:
day Cases
29/04/2020 1123
28/04/2020 1090
27/04/2020 908
我想获取过去 2 天的病例数之间的差异。
【问题讨论】:
LAG() 函数根据指定的排序条件生成前一行的值。
你可以如下图使用:
select t.*, cases - lag(cases) over(order by day) as diff from t
【讨论】:
where 子句中 - 如果确实只需要两行以上的 lag() ,那么在整个表中计算 lag() 毫无意义。跨度>
我想获取过去 2 天的病例数之间的差异
您可以使用窗口函数和聚合:
select
max(case when rn = 1 then cases end)
- max(case when rn = 2 then cases end) case_diff
from (
select cases, row_number() over(order by day desc) rn
from mytable
) t
where rn <= 2
在子查询中,row_number() 按降序排列行day;然后外部查询过滤最后两行,并使用条件表达式获取cases 的最后一个值与上一个值之间的差异。
【讨论】:
你可以使用:
select t.cases - tprev.cases
from t join
t tprev
on t.day = trunc(sysdate) and tprev.day = trunc(sysdate - 1);
如果您在(day) 上有索引,您可能会对性能印象深刻。
【讨论】: