微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

首选 ReplacingMergeTree 中最旧的版本

如何解决首选 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 举报,一经查实,本站将立刻删除。