如何获取表中的“最新日期”和Oracle SQL中的“先前日期”值的差值?

时间:2019-08-27 15:45:50

标签: sql oracle

如何获得最大日期记录与前一天之间以及最大日期记录与日期前7天之间的大小差异(使用Oracle SQL)。

Date          Size
-----        ------
26-Aug-19     20
25-Aug-19     10
24-Aug-19     30
23-Aug-19     40
22-Aug-19     14
21-Aug-19     16
20-Aug-19     19
19-Aug-19     21

我能够在解码中使用SYSDATE。但是无法解决在解码语句中使用GREATEST(Date)的问题。必须获取最新日期,然后执行Latestdate-1和LatestDate-7,然后找出差异。

所需结果:

Date          Diff Size 1d    Diff Size 1w
-----        -------------    ------------
26-Aug-19     10               -1

2 个答案:

答案 0 :(得分:1)

您可以在每天只有一行的情况下尝试

SELECT DATE, DIFF_SIZE_ID, DIFF_SIZE_1W FROM
(SELECT DATE,
SIZE - LAG(SIZE,1) OVER (ORDER BY DATE) AS DIFF_SIZE_ID,
SIZE - LAG(SIZE,7) OVER (ORDER BY DATE) AS DIFF_SIZE_1W,
ROW_NUMBER() OVER (ORDER BY DATE DESC NULLS LAST) AS RN
FROM TABLE)
WHERE RN = 1;

干杯!

答案 1 :(得分:1)

您可以考虑使用max("Date") over (order by "Date" desc)first_value("Size") over ( order by "Date" desc ) - "Size"列进行比较来检测"Date"的最大日期和非空值:

select max(max_date) as "Date", 
       max(day_before) as "Diff Size 1d", 
       max(week_before) as "Diff Size 1w"
  from
  (
   select max("Date") over (order by "Date" desc) max_date,
          case when max("Date") over (order by "Date" desc) - 1 = "Date" then
               first_value("Size") over ( order by "Date" desc ) - "Size"
          end day_before,  
          case when max("Date") over (order by "Date" desc) - 7 = "Date" then
               first_value("Size") over ( order by "Date" desc ) - "Size"
          end week_before
     from tab);

Date        Diff Size 1d    Diff Size 1w
---------   ------------    ------------
26-AUG-19   10              -1

P.S。如果您有日期为max("Date") - 1max("Date") - 7

的记录

Demo