用于合并重复项的存储过程 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)
假设在 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)