【问题标题】:PostgreSQL: Merge records within a tablePostgreSQL:合并表中的记录
【发布时间】:2018-12-23 21:53:09
【问题描述】:

我有一张大桌子,其结构如下:

如上图所示,主键由 intervalstart 和 edgeid 组成,因此该表中没有重复条目。

我现在要做的是更新一些 edgeid,因为其中一些已被弃用。 例如,我想用新的 edgeid “E304178582From”更新所有具有 edgeid “E304178540From”的记录。如上图所示,这将失败,因为我会创建一个副本(但 avgvelocity、measurementcount 和 vehiclecount 的值不同)。

因此,作为一种解决方案,我想“合并”这些记录(在此示例中,上图中的前两个条目)并计算 avgvelocity、measurementcount 和 vehiclecount 的新值(通过计算平均值)。

所以它看起来像这样:

间隔开始 |天 |边缘ID |平均速度 |测量计数 |车辆数

2014-01-01 00:00:00 | 3 | E304178582发件人 | 85 | 1 | 120

关于如何解决这个问题的任何建议? 感谢您能给我的任何帮助!

【问题讨论】:

  • 如果您的用例仅限于 postgresql 数据库,请从此问题中删除 mysql 标签。

标签: database postgresql merge duplicates


【解决方案1】:

一种选择是使用插入命令的 ON Conflcit 子句。语法如下:

INSERT INTO table_name(column_list) VALUES(value_list)
ON CONFLICT target action;

所以,尝试插入一条会导致冲突的新记录(基于时间戳和 edgeid),在 on conflict 子句中计算新的 avg 等。您可以使用 EXCLUDED 伪表引用原始值。

请参阅此处的文档以获取更多信息: https://www.postgresql.org/docs/9.5/static/sql-insert.html

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多