问题是编写下面定义的“ADD-VALUE”请求。
对于下表中的每个“ cat ”值,只保留 3 条记录。图这个表:
ID | 猫 | 价值 | 更新时间 |
---|---|---|---|
1 | 猫1 | v1 | 06/01/2021 00:00:01 |
2 | 猫1 | v2 | 2021 年 6 月 1 日 00:00:02 |
3 | 猫1 | v3 | 06/01/2021 00:00:03 (指针 cat1 在这里) |
4 | 猫2 | v1 | 06/01/2021 00:01:01 |
5 | 猫2 | v2 | 06/01/2021 00:01:02 (指针 cat2 在这里) |
插入案例:调用“ADD-VALUE(cat= cat2 , value=v3)”将产生粗体结果:
ID | 猫 | 价值 | 更新时间 |
---|---|---|---|
1 | 猫1 | v1 | 06/01/2021 00:00:01 |
2 | 猫1 | v2 | 2021 年 6 月 1 日 00:00:02 |
3 | 猫1 | v3 | 06/01/2021 00:00:03 (指针 cat1 在这里) |
4 | 猫2 | v1 | 06/01/2021 00:01:01 |
5 | 猫2 | v2 | 06/01/2021 00:01:02 |
6 | 猫2 | v3 | 06/01/2021 00:01:02 (指针 cat2 现在在这里) |
更新案例:调用“ADD-VALUE(cat= cat1 , value=v4)”将产生粗体结果:
ID | 猫 | 价值 | 更新时间 |
---|---|---|---|
1 | 猫1 | v4 | 07/01/2021 00:00:04 (指针 cat1 现在在这里) |
2 | 猫1 | v2 | 2021 年 6 月 1 日 00:00:02 |
3 | 猫1 | v3 | 2021 年 6 月 1 日 00:00:03 |
4 | 猫2 | v1 | 06/01/2021 00:01:01 |
5 | 猫2 | v2 | 06/01/2021 00:01:02 (指针 cat2 在这里) |
欢迎任何建议。一个请求中的 UPDATE 或 INSERT 可能是不可能的?我考虑使用 row-num 来计算每个类别的数量。
在并发负载下执行您的想法会很痛苦。相反,只需继续添加新行(
INSERT
仅限)。有简单快速的查询来获取每只猫的当前行。确保这
updated_at
是最新的。我添加了一个列默认值和一个触发器。要排除相同猫和相同时间戳的重复条目,请添加 UNIQUE 约束。或者,绝对确定,这样做:
默认值通常会廉价地处理插入,但可以通过显式插入值来推翻它。无论如何,触发器都会推翻。
要获取给定猫的“当前”行:
当您有匹配的索引时,这非常快:
在现代 Postgres 版本中,您可以使用唯一的覆盖索引来替换索引和
UNIQUE
约束。看:要获取最后三(实时)行,请使用相同的查询
LIMIT 3
:不时(当您的数据库加载和计划允许/要求)删除不推荐使用的行:
db<>在这里摆弄