如何在 Snowflake 色谱柱中进行 MinMax Scale 并仍然保持色谱柱的总和?

How to do a MinMax Scale in Snowflake column and still maintain overall sum of column?

提问人:Paulo Masnik 提问时间:7/17/2023 最后编辑:Paulo Masnik 更新时间:7/17/2023 访问量:78

问:

我目前对 Snowflake 有一个挑战,我有一个像波纹管一样的 PRICE 列,目标是“缩放”这个值,但保持原始总和不变,比如,我不需要尊重刻度上的比例,但最低值应该继续是最低的,依此类推。 另外,我想这可能是一个SQL问题。

我尝试使用 WIDTH_BUCKET 运行脚本,但没有选项可以维护总和。

`SELECT 
    sale_date, 
    price,
    WIDTH_BUCKET(price, 200000, 600000, 5) AS "SALES GROUP"
  FROM home_sales
  ORDER BY sale_date;`

`+------------+-----------+-------------+
| SALE_DATE  |     PRICE | SALES GROUP |
|------------+-----------+-------------|
| 2013-08-01 | 10        |           1 |
| 2014-02-01 | 20        |           2 |
| 2015-04-01 | 30        |           3 |
| 2016-04-01 | 10        |           1 |
| 2017-04-01 | 50        |           4 |
| 2018-04-01 | 60        |           5 |
+------------+-----------+-------------+`

我真正要找的输出(SALES GROUP 列)是这样的: 在此示例中,列价格的总 SUM 为 180。

`+------------+-----------+-------------+
| SALE_DATE  |     PRICE | SALES GROUP |
|------------+-----------+-------------|
| 2013-08-01 | 10        |          12 |
| 2014-02-01 | 20        |          24 |
| 2015-04-01 | 30        |          28 |
| 2016-04-01 | 10        |          12 |
| 2017-04-01 | 50        |          47 |
| 2018-04-01 | 60        |          57 |
+------------+-----------+-------------+`

如果我们对 SALES GROUP 列求和,它仍然有 180 个总数。 *OBS:我知道这并不完全是缩放,但我是雪花的新手,没有找到最正确的术语。

sql 花-云-数据-平台 特征-工程

评论

0赞 NickW 7/17/2023
嗨 - 对我来说,不清楚您用于计算结果中销售组值的逻辑/规则是什么。为什么这些值而不是许多其他似乎有效的值中的任何一个,例如,您可以在 3 个最低价格上添加 1(或 2 或 3 或 4),然后从 3 个最高价格中减去该值,得到一个似乎符合您要求的结果
0赞 Paulo Masnik 7/17/2023
就像你描述的那样,但想象一下我有大量的行,我想“随机化”这个值,但保持它的总和不变。

答:

0赞 Kathmandude 7/17/2023 #1

如何扩大自然对数以匹配总和?

select *, (ln(price) * sum(price) over() / sum(ln(price)) over())::int as scaled_price
from t;

评论

0赞 Kathmandude 7/17/2023
注意:我假设价格不能 = 0,因为在这种情况下 ln(0) 是未定义的。如果适用,请使用 case/iff 表达式来处理该问题。