【问题标题】:Update column value to be minimum of all column values before it将列值更新为之前所有列值的最小值
【发布时间】:2021-08-01 05:23:30
【问题描述】:

我有一张表,当根据周数排序时,它会给出商店中产品的剩余单位。剩下的单位应该总是减少。但是,由于存在一些垃圾值,因此留在商店中的单位会在几周内增加,然后再次减少。我只有这四列可以使用。我想用正确的值替换垃圾值。我正在寻找以下垃圾值替换逻辑的 SQL - 每周剩余的单位应该是其上方所有行的剩余单位值中的最小值,按周数升序排序。

例如在这里,第 4 周和第 5 周到 12,然后又回到 9 - 这是不正确的 - 他们 [the 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 标签,因为问题表明这是正在使用的标签

标签: sql data-science teradata


【解决方案1】:

您可以在 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;

【讨论】:

    【解决方案2】:

    您可以使用累积最小值:

    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 语法,应该适用于您最初标记的所有数据库。

    如果您想实际更改数据——好吧,语法因数据库而异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      相关资源
      最近更新 更多