如何解决首选 ReplacingMergeTree 中最旧的版本
我有一个可能有点奇怪的用例。我必须对数据进行大量计数并从中构建快照(例如“可以访问该实体的用户数量”)。现在,我将每个实体的这些数字与时间戳一起存储(因此基本上“此时,x 个用户可以访问该实体”)。
现在可能是,快照之间的数量不会改变,因为没有更改访问列表和/或没有添加用户。这实际上甚至可能是默认情况。所以当然我想避免有成千上万条相同的线路(“晚上 10 点有 5 个用户”、“晚上 11 点有 5 个用户”、“中午 12 点有 5 个用户”等等)。因此想到了 ReplacingMergeTree。 order by
将是 entity,count
。
还是有问题。如果我正确理解文档,ReplacingMergeTree 现在将始终保留最新的行。所以时间戳会改变。虽然我想保留最旧的时间戳,但我知道这个计数是第一次计算的。这反过来我可以用来填补空白(如果计数是 3 小时前的,并且中间没有更新的计数,显然可以假设 2 小时前和 1 小时前的计数相同)。
有什么办法可以做到这一点吗?
唯一可能想到的可能是使用 uint
作为版本并从 MaxUint 开始然后递减。但这感觉有点奇怪。
解决方法
到目前为止我发现的最好方法是添加一个版本列:UInt32 DEFAULT 4294967295 - toUnixTimestamp(create_time)
CREATE TABLE test
(
`id` UInt8,`value` UInt8,`version` UInt32 DEFAULT 4294967295 - toUnixTimestamp(create_time),`create_time` DateTime DEFAULT now()
)
ENGINE = ReplacingMergeTree(version)
ORDER BY id;
INSERT INTO test (id,value) VALUES (1,1);
INSERT INTO test (id,2);
SELECT * FROM test;
┌─id─┬─value─┬────version─┬─────────create_time─┐
│ 1 │ 1 │ 2670403264 │ 2021-06-25 03:47:11 │
└────┴───────┴────────────┴─────────────────────┘
┌─id─┬─value─┬────version─┬─────────create_time─┐
│ 1 │ 2 │ 2670403251 │ 2021-06-25 03:47:24 │
└────┴───────┴────────────┴─────────────────────┘
SELECT * FROM test FINAL;
┌─id─┬─value─┬────version─┬─────────create_time─┐
│ 1 │ 1 │ 2670403264 │ 2021-06-25 03:47:11 │
└────┴───────┴────────────┴─────────────────────┘
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。