【发布时间】:2021-12-21 08:40:41
【问题描述】:
我在 SQL Server 2016 数据库表中有这样的数据:
| PERIODE | PERIODE_FORECAST | VALUE |
|---|---|---|
| 2021-08-01 | 2021-01-01 | 51384.673 |
| 2021-08-01 | 2021-02-01 | 44118.129 |
| 2021-08-01 | 2021-03-01 | 43164.446 |
| 2021-08-01 | 2021-04-01 | 38113.745 |
| 2021-08-01 | 2021-05-01 | 37306.956 |
| 2021-08-01 | 2021-06-01 | 38390.359 |
| 2021-08-01 | 2021-07-01 | 42692.390 |
| 2021-08-01 | 2021-08-01 | 39814.047 |
| 2021-08-01 | 2021-09-01 | 0.000 |
| 2021-08-01 | 2021-10-01 | 0.000 |
| 2021-08-01 | 2021-11-01 | 0.000 |
| 2021-08-01 | 2021-12-01 | 0.000 |
我有条件填写零值例如:
| PERIODE | PERIODE_FORECAST | VALUE |
|---|---|---|
| 2021-08-01 | 2021-09-01 | 39814.047 * 0.5 |
| 2021-08-01 | 2021-10-01 | (39814.047 * 0.5 ) * 0.7 |
| 2021-08-01 | 2021-11-01 | ((39814.047 * 0.5 ) * 0.7) * 0.5 |
| 2021-08-01 | 2021-12-01 | (((39814.047 * 0.5 ) * 0.7) * 0.5) * n |
我正在尝试使用LAG() 函数,但它没有如我所愿。
查询:
SELECT
PERIODE,PERIODE_FORECAST,
CASE
WHEN PERIODE_FORECAST > PERIODE
THEN LAG(VALUE, 1, 0) OVER (ORDER BY PERIODE_FORECAST ASC) * [some function/other column values]
ELSE VALUE
END VALUE
FROM
MyTable
我期待结果:
| PERIODE | PERIODE_FORECAST | VALUE |
|---|---|---|
| 2021-08-01 | 2021-01-01 | 51384.673 |
| 2021-08-01 | 2021-02-01 | 44118.129 |
| 2021-08-01 | 2021-03-01 | 43164.446 |
| 2021-08-01 | 2021-04-01 | 38113.745 |
| 2021-08-01 | 2021-05-01 | 37306.956 |
| 2021-08-01 | 2021-06-01 | 38390.359 |
| 2021-08-01 | 2021-07-01 | 42692.390 |
| 2021-08-01 | 2021-08-01 | 39814.047 |
| 2021-08-01 | 2021-09-01 | 19907.0235 |
| 2021-08-01 | 2021-10-01 | result on 2021-09-01 |
| 2021-08-01 | 2021-11-01 | result on 2021-10-01 |
| 2021-08-01 | 2021-12-01 | result on 2021-11-01 |
如何使用上一个计算的行,并在当前行的计算中使用它?
有没有不创建存储过程的解决方案或变通方法?
到目前为止,感谢您的回答。
【问题讨论】:
-
您必须为此使用递归查询。 LAG 不起作用。
-
如果按 PERIODE_FORECAST 排序,0 值是否总是在底部?
-
Phil Coulson,是的,0 总是在底部
标签: sql sql-server date datetime recursive-query