每个范围的最小和最大 ID,其中范围是 ClickHouse 中的 N 行
Min & Max ids per range where range is N rows in ClickHouse
在 ClickHouse 中可能没有办法做到这一点,但我希望有。
我有一个查询 returns Uint64 id。
SELECT ids FROM <tableName> WHERE...
我想执行以下操作:
将查询结果分成 N 个 ID 的块或数组。
Return 只有每个块的最小和最大 id。
这可能来自 ClickHouse 查询吗?
我不熟悉 clickhouse,但我可能建议使用模块化数学来分块数据。
所以你可以做 SELECT id % n 其中 n 是你想要的块数并按 id % n 分组,选择最大和最小 ids。
编辑:这假设您有完全连续的 int id。如果不是,您需要为每一行分配一个行号。
在 ClickHouse Telegram 频道的帮助下,我们终于解决了这个问题。放在这里以防其他人可以使用此信息:
SELECT min(id) AS minId, max(id) AS maxId, bucket_num, FROM (
SELECT id, toUInt32(rowNumberInAllBlocks() / :rows) AS bucket_num FROM (
SELECT id
FROM <tableName>
WHERE date_time >= :minDateTime
AND date_time <= :maxDateTime
ORDER BY id ASC))
GROUP BY bucket_num
ORDER BY bucket_num DESC
在 ClickHouse 中可能没有办法做到这一点,但我希望有。
我有一个查询 returns Uint64 id。
SELECT ids FROM <tableName> WHERE...
我想执行以下操作:
将查询结果分成 N 个 ID 的块或数组。
Return 只有每个块的最小和最大 id。
这可能来自 ClickHouse 查询吗?
我不熟悉 clickhouse,但我可能建议使用模块化数学来分块数据。 所以你可以做 SELECT id % n 其中 n 是你想要的块数并按 id % n 分组,选择最大和最小 ids。
编辑:这假设您有完全连续的 int id。如果不是,您需要为每一行分配一个行号。
在 ClickHouse Telegram 频道的帮助下,我们终于解决了这个问题。放在这里以防其他人可以使用此信息:
SELECT min(id) AS minId, max(id) AS maxId, bucket_num, FROM (
SELECT id, toUInt32(rowNumberInAllBlocks() / :rows) AS bucket_num FROM (
SELECT id
FROM <tableName>
WHERE date_time >= :minDateTime
AND date_time <= :maxDateTime
ORDER BY id ASC))
GROUP BY bucket_num
ORDER BY bucket_num DESC