从现场获取价值

时间:2019-07-27 10:55:08

标签: sql database oracle

我试图学习SQL,但遇到一个无法解决自己的问题。 我有一张桌子,想从中获取一个特定值,但似乎无法解决它。

我要创建直到Today-2的平均值,并为Today-1创建一个CASE,以检查其值(12)是否偏离太多。

问题:我无法从2019年7月26日获得价值; 天是(sysdate-8)-> sysdate

| day        | value  | 
|------------|------- |
| 19.07.2019 | 10     | <-- START
| 20.07.2019 | 13     |
| 21.07.2019 | 13     |
| 22.07.2019 | 12     |
| 23.07.2019 | 13     |
| 24.07.2019 | 18     |
| 25.07.2019 | 16     | <-- STOP AVERAGE
| 26.07.2019 | 12     | <-- COMPARE AVERAGE WITH THIS
| 27.07.2019 | 5      | <-- IGNORE SINCE DATA FROM TODAY NOT COMPLETE

感谢您阅读

2 个答案:

答案 0 :(得分:0)

您可能正在寻找一个窗口函数来计算运行平均值:

select t.*,
       avg(value) over (order by day rows between 8 preceding and 1 preceding) as running_avg
from t;

答案 1 :(得分:0)

我试图基于日期值创建一个解决方案,并且不使用解析函数,因为如果某天的数据丢失并且解析函数在多行而不是数据上工作,它可能会给出错误的结果。

以下查询将为您提供前一天值的输出以及当前天的平均值-8到当前天-2

SELECT
    MAX(CASE
        WHEN DAY = SYSDATE - 1 THEN VALUE
    END) AS LAST_DAY_VALUE,
    AVG(CASE
        WHEN DAY BETWEEN SYSDATE - 8 AND SYSDATE - 2 THEN VALUE
    END) AS AVG_B4_LAST_TO_LAST_DAY
FROM
    YOUR_TABLE;

干杯!