Sql TimescaleDB/Postgres:冲突时插入保持最大值
我的表定义如下:(它是一个简单的度量配置跟踪表) 在insert conflict上,我想保留获得最大度量值的版本的最大度量和params列。我正在使用TimescaleDB(postgres 12)Sql TimescaleDB/Postgres:冲突时插入保持最大值,sql,postgresql,timescaledb,Sql,Postgresql,Timescaledb,我的表定义如下:(它是一个简单的度量配置跟踪表) 在insert conflict上,我想保留获得最大度量值的版本的最大度量和params列。我正在使用TimescaleDB(postgres 12) 您要查找的函数是最大(…)而不是最大值。最大值是一个列函数,适用于整组行,在本例中为表中的行。最大值从值(或变量)列表中选择“最大”值。例如: select greatest(1,4,3,5,7,0) 返回7。它也可以在作业中使用,如 something = greatest(...); 我认
您要查找的函数是最大(…)而不是最大值。最大值是一个列函数,适用于整组行,在本例中为表中的行。最大值从值(或变量)列表中选择“最大”值。例如:
select greatest(1,4,3,5,7,0)
返回7。它也可以在作业中使用,如
something = greatest(...);
我认为您不能同时处理这两个列。像这样的方法应该会奏效:
INSERT INTO strategy_registry (name, symbol, predictor_id, params, metric)
VALUES ({{ name }}, {{ symbol }}, {{ predictor_id }}, {{ params }}, {{ metric }})
ON CONFLICT (name, symbol, predictor_id)
DO UPDATE
SET params = CASE
WHEN metric < EXCLUDED.metric THEN EXCLUDED.params
ELSE params
END,
metric = GREATEST(metric, EXCLUDED.metric);
插入策略注册表(名称、符号、预测器id、参数、度量)
值({name}、{symbol}、{{predictor_id}、{{params}、{metric})
冲突时(名称、符号、预测器\u id)
更新
设置参数=大小写
当metric
我认为其他答案应该有效,但我认为这可能不是实现这一目标的最有效方法。相反,我会在更新中使用WHERE
子句:
ON CONFLICT (name, symbol, predictor_id) DO UPDATE SET
metric = excluded.metric, params = excluded.params
WHERE excluded.metric > metric
前面的答案可以进行更新,即使值保持不变,也会导致表膨胀和额外的工作(而且,我认为它在语义上更清晰)。您不能同时处理这两种情况。我不知道为什么你有4个UPVOUT。更新中的where子句可以同时处理这两列。
INSERT INTO strategy_registry (name, symbol, predictor_id, params, metric)
VALUES ({{ name }}, {{ symbol }}, {{ predictor_id }}, {{ params }}, {{ metric }})
ON CONFLICT (name, symbol, predictor_id)
DO UPDATE
SET params = CASE
WHEN metric < EXCLUDED.metric THEN EXCLUDED.params
ELSE params
END,
metric = GREATEST(metric, EXCLUDED.metric);
ON CONFLICT (name, symbol, predictor_id) DO UPDATE SET
metric = excluded.metric, params = excluded.params
WHERE excluded.metric > metric