在两天内计算表格列之间的差异

nav*_*igh 2 sql oracle

我在oracle数据库中有一个如下表:

s_num     eff_date     amount
1         07-OCT-18      110
1         06-OCT-18      50
2         07-OCT-18      200
2         06-OCT-18      150
Run Code Online (Sandbox Code Playgroud)

我想找到今天和昨天的"金额"列之间的差异.结果必须如下

s_num    diff
1         60
2         50
Run Code Online (Sandbox Code Playgroud)

我想这样做而不加入桌子本身.

Kau*_*yak 5

你可以使用条件聚合

SELECT s_num,SUM (CASE 
                    WHEN eff_date >= TRUNC(sysdate) 
                       AND eff_date < TRUNC(sysdate) + 1 THEN amount --today
                    WHEN eff_date >= TRUNC(sysdate) - 1 
                       AND eff_date < TRUNC(sysdate) THEN - amount --yesterday
                END) 
    FROM   t 
    GROUP  BY s_num; 
Run Code Online (Sandbox Code Playgroud)

LAG功能

SELECT s_num, 
       diff 
FROM   (SELECT s_num, 
               eff_date,
               amount - LAG(amount, 1, 0) 
                          OVER ( 
                            partition BY s_num 
                            ORDER BY eff_date ) AS diff 
        FROM   t) 
WHERE  eff_date >= trunc(sysdate) 
       AND eff_date < trunc(sysdate) + 1 ;
Run Code Online (Sandbox Code Playgroud)

演示

第一个将打印NULL除今天以外的天数差异,第二个不会返回其他日期的任何行.

  • @GaneshChowdharySadanala:你在谈论什么开销?如何使用您的用户定义函数更高效?你有没有运行`EXPLAIN PLAN`?如果给定日期有多行,该怎么办?如果我明天使用你的函数运行查询,它会提供所需的结果吗? (2认同)