Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql TimescaleDB/Postgres:冲突时插入保持最大值_Sql_Postgresql_Timescaledb - Fatal编程技术网

Sql TimescaleDB/Postgres:冲突时插入保持最大值

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(...); 我认

我的表定义如下:(它是一个简单的度量配置跟踪表)

在insert conflict上,我想保留获得最大度量值的版本的最大度量和params列。我正在使用TimescaleDB(postgres 12)


您要查找的函数是最大(…)而不是最大值。最大值是一个列函数,适用于整组行,在本例中为表中的行。最大值从值(或变量)列表中选择“最大”值。例如:

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