在我的数据库中,我有一个列(progress_history),它捕获了如下值:
eg1: {'2022-11-01': 44038.91099579527, '2022-12-05': 44038.91099579527, '2023-01-21': 20623.839917193636, '2023-02-01': 20623.839917193636, '2023-02-25': 20623.839917193636}
eg2: {'2023-05-26T12:53:50.708195+00:00': 0.0, '2023-05-26T12:53:51.034034+00:00': 0}
这将捕获不同时间段的度量值
我试图实现的是,从今天开始的最后6个月,代码应该查看不同的月份并捕获与该月份相关的值。
例如,在eg1中,对于Nov'22,它应该给予44038.91,等等&在eg2中,对于May'23,它应该给出50.71(月份的最低日期值)。
尝试以下代码,仅当在每月的第一天捕获度量时才给我值。而且,我无法动态地获得月份。使用特里诺DB.
with kpis as (
select
k.kpi,
k.progress_history,
replace(k.progress_history, '''', '"') as progress_cleaned
from
kpis as k
)
select
kpi,
json_extract(
progress_cleaned,
'$."2022-10-01"',
'$."2022-11-01"',
'$."2022-12-01"',
'$.error()'
)
emits(
"2022-10-01" double,
"2022-11-01" double,
"2022-12-01" double,
error_column varchar(2000000)
)
from kpis
;
1条答案
按热度按时间kupeojn61#
第一步是将字符串转换为
progress_history
列。您的CTE正确地做到了这一点(尽管恕我直言,您应该在存储数据时这样做,以便在数据库中始终具有有效的JSON)。剩下的就是从JSON中提取键值对到标准列的转换,以及 key 的日期(时间戳)操作。我不知道你从哪里得到了 json_extract的语法用户... emits(可能是对MySQl文档的无效引用),但它不是来自Postgres;两者都不存在。要提取键值对,请使用函数jsonb_each()。要获取每个月的最低值,请结合使用window函数row_number()和date_trunc()函数。综合起来得出:(参见demo)注:演示的数据更改。对于exp 2,将预期值更改为123.46,因为预期值50.71不是键值对的值,它是密钥(时间戳)的一部分。