每个范围的最小和最大 ID,其中范围是 ClickHouse 中的 N 行

Posted

技术标签:

【中文标题】每个范围的最小和最大 ID,其中范围是 ClickHouse 中的 N 行【英文标题】:Min & Max ids per range where range is N rows in ClickHouse 【发布时间】:2018-06-14 17:40:59 【问题描述】:

在 ClickHouse 中可能没有办法做到这一点,但我希望有。

我有一个返回 Uint64 id 的查询。

SELECT ids FROM <tableName> WHERE...

我想做以下事情:

将查询结果分成 N 个 id 的块或数组。

仅返回每个块的最小和最大 ID。

这可能来自 ClickHouse 查询吗?

【问题讨论】:

澄清:我正在寻找生成的批次按顺序包含id,以便第一批中的id都小于其他批次中的id。我需要能够在以后重新组合批次。 【参考方案1】:

在 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

【讨论】:

【参考方案2】:

我不熟悉 clickhouse,但我可能会建议使用模块化数学来分块数据。 因此,您可以执行 SELECT id % n ,其中 n 是您想要的块数并按 id % n 分组,选择最大和最小 id。

编辑:这假设您有完全连续的 int id。如果不是,您需要为每一行分配一个行号。

【讨论】:

啊,我意识到我没有明确要求抱歉。虽然这会给我大小均匀的夹头,但它们不会按顺序排列。我需要批次 0 的所有 id

以上是关于每个范围的最小和最大 ID,其中范围是 ClickHouse 中的 N 行的主要内容,如果未能解决你的问题,请参考以下文章

从 pandas 的时间序列范围中查找最小和最大日期

在 SQL (Big Query) 中生成序列/范围/数组,其中最小值和最大值取自另一个表

如何缩小具有已知最小值和最大值的数字范围

按名称分组的连续日期范围内的最小和最大日期

找到给定范围内数字的最大最小差

获取单行中连接的值的范围(最小值 - 最大值)