将列值更新为它之前所有列值的最小值
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 语法,应该适用于您最初标记的所有数据库。
如果您想实际更改数据 -- 嗯,语法因数据库而异。
我有一个 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 语法,应该适用于您最初标记的所有数据库。
如果您想实际更改数据 -- 嗯,语法因数据库而异。