【问题标题】:indicator for increase over time随时间增加的指标
【发布时间】:2020-11-30 16:27:49
【问题描述】:

我正在尝试创建一个指标,用于在组内随时间增加价值。特别是,如果价值随着时间的推移增加了 50%,我会尝试标记某些 grp

我有一个看起来像这样的原始数据:

id    grp     value_dt    value
--------------------------------
1      1      11/20/20     1.4
1      1      11/21/20     0.8
1      1      11/24/20     2.8
1      1      11/25/20     2.5
1      2      11/29/20     1.5
1      2      12/1/20      1.6
2      1      11/21/20     0.8
2      2      11/26/20     0.9
2      3      12/1/20      0.9
2      3      12/3/20      2.8

您可以看到,对于 id = 1 and grp = 1,该值会随着时间的推移而增加和减少,但因为它在 2020 年 11 月 21 日和 20 年 11 月 24 日之间随时间从 0.8 增加到 2.8(大于 50 % 增加),我想标记整个grp 1。我希望我的输出看起来像:

id    grp     val_ind 
-----------------------
1      1         1
1      2         0 
2      1         0 
2      2         0 
2      3         1 

我只能考虑使用 min 和 max(如下所示),其中不包括“随时间”因素...

select id, 
grp, 
min(value) as min_grp, 
max(value) as max_grp, 
(max_grp - min_grp) as val_diff, 
case when val_diff >= min_grp * 1.5 then 1 else 0 end as val_ind

如果有人可以提供他们的建议,我将不胜感激!

【问题讨论】:

  • 您所说的“时间因素”是什么意思?当然,同一组中的两行(具有不同的values)总是来自不同的日期。
  • @Bergi 嗨,我的意思是在较小的价​​值之后必须发生较大的价值。

标签: postgresql conditional-statements case-when


【解决方案1】:

我想你想知道是否在任何时候有 50% 的增长,你标记那个组。如果是的话,这是你可以做到的, 你需要使用 cte 和 window 函数:

; WITH cte AS (
SELECT *
, CASE WHEN  COALESCE(LEAD(value) OVER (PARTITION BY id, grp ORDER BY value_dt),0)  >= value* 2 THEN 1 ELSE 0 END val_ind
FROM  ttt
)

SELECT 
id , grp , MAX(val_ind) val_ind
FROM cte 
GROUP BY 
id , grp
编号 | grp | val_ind -: | --: | ------: 1 | 1 | 1 1 | 2 | 0 2 | 1 | 0 2 | 2 | 0 2 | 3 | 1

db小提琴here

【讨论】:

    猜你喜欢
    • 2021-08-08
    • 2021-07-18
    • 2021-11-12
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多