将列值更新为它之前所有列值的最小值

Update column value to be minimum of all column values before it

我有一个 table,当根据周数排序时,它给出了商店中产品的剩余数量。剩下的单位应该总是递减的。但是,存在一些垃圾价值,导致商店中剩余的商品数周增加,然后又减少。我只有这四列可以使用。我想用正确的值替换垃圾值。我正在寻找以下垃圾值替换逻辑的 SQL - 每周剩余的单位应该是其上方所有行剩余单位中的最小值,按周数升序排序。

例如这里第 4 周和第 5 周变为 12,然后回到 9 - 这是不正确的 - 它们 [12s] 应该分别替换为 9

输入:---

+-------+------------+-------------+------------+
| Store | Product ID | Week Number | Units left |
+-------+------------+-------------+------------+
| XXX   | A1         |           1 |       10.0 |
| XXX   | A1         |           2 |          9 |
| XXX   | A1         |           3 |          9 |
| XXX   | A1         |           4 |         12 |
| XXX   | A1         |           5 |         12 |
| XXX   | A1         |           6 |          9 |
| XXX   | A1         |           7 |          8 |
+-------+------------+-------------+------------+

输出:----

+-------+------------+-------------+------------+
| Store | Product ID | Week Number | Units left |
+-------+------------+-------------+------------+
| XXX   | A1         |           1 |       10.0 |
| XXX   | A1         |           2 |          9 |
| XXX   | A1         |           3 |          9 |
| XXX   | A1         |           4 |          9 |
| XXX   | A1         |           5 |          9 |
| XXX   | A1         |           6 |          9 |
| XXX   | A1         |           7 |          8 |
+-------+------------+-------------+------------+

数据库是 Teradata。

您可以试试 teradata 中的累积最小值函数。

Select Store, Product_ID, Week_Number, Units,
MIN(Units) over (PARTITION BY Store, Product_ID ORDER BY Week_Number ROWS UNBOUNDED PRECEDING) as Corrected_units from TABLE_NAME;

您可以使用累积最小值:

select t.*,
       min(units_left) over (partition by store, product_id
                             order by date
                             rows between unbounded preceding and current row
                            ) as imputed_units_left
from t;

这是标准 SQL 语法,应该适用于您最初标记的所有数据库。

如果您想实际更改数据 -- 嗯,语法因数据库而异。