用于合并重复项的存储过程 Firebird

Stored procedure Firebird for merging duplicates

假设在 table 中,我们每 10 秒插入多行,如下所示:

ID     ts         col1    col2    col3   
1      00:00:00   1234    3456    4567
2      00:00:10   1234    3456    4567
3      00:00:20   1234    3456    4567
4      00:00:30   1234    3456    4567
5      00:00:40   1234    3456    4567
6      00:00:50   1234    3456    4567

如前所述,除了 ID 和 TS 列之外的所有内容都是相同的。不需要重复项,只是它们的更新版本。我正在考虑制作一个存储过程和触发器来自动执行行合并,并希望得到这样的结果:

ID     ts         col1      col2    col3   
1      00:00:00   1234x5    3456    4567   
6      00:00:50   1234      3456    4567

正如您想象的那样,这样的数据库扩展得很快。所以想法是通过每显示 5 次记录将重复记录合并为一行来减慢扩展速度。

到目前为止,我设法获得了所有重复项:

SELECT b.*
FROM (SELECT COUNT(*) as cnt, col1, col2, col3 
      FROM table1
      GROUP BY col1, col2, col3 
      HAVING COUNT(*) > 1) a
INNER JOIN table1 b ON a.col1 = b.col1 AND a.col2 = b.col2 AND a.col3 = b.col3;

在此之后我想到了 ROW_COUNT - 如果我可以在过程中使用上层语句生成的记录数,然后根据它进行合并。但不幸的是,我的知识到此为止。

所以我的问题是 - 是否有可能制作这样的东西?如果是那么怎么办?

对于这些行,您应该使用像这样的 UPDATE OR INSERT(或 MERGE)语句而不是 INSERT

MERGE INTO t
 USING (SELECT 1 ID, _time'00:00:00' ts, 1234 col1, 3456 col2, 4567 col3 FROM rdb$database) AS d
 ON t.ID = d.ID and t.col1 = d.col1 and t.col3 = d.col3
 WHEN MATCHED UPDATE SET t.end_ts = d.ts, t.r_count = t.r_count + 1
 WHEN NOT MATCHED INSERT (ID, ts, end_ts, r_count, col1, col2, col3) VALUES (d.ID, d.ts, d.ts, 1, d.col1, d.col2, d.col3)