我有一个聚合了一些UNION ALL选择的子查询。在此之前,我准备了SELECT
来创建交叉表并将其限制为20.我希望能够在主查询中限制它们之前检索子查询结果的总计数。这是为了尝试构建一个分页,它接收记录的总数,然后是特定的页面记录网格。在应用LIMIT(clickhouse)之前对子查询进行SELECT计数
样品查询:
SELECT
name,
sumIf(metric_value, metric_name = 'data') AS data,
sumif(....
FROM
(SELECT
name, metric_name, SUM(metric_value) as metric_value
FROM
(SELECT
name, 'data' AS metric_name, SUM(data) AS metric_value
FROM
table
WHERE
date > '2017-01-01 00:00:00'
GROUP BY
name
UNION ALL
SELECT
name, 'data' AS metric_name, SUM(data) AS metric_value
FROM
table2
WHERE
date > '2017-01-01 00:00:00'
GROUP BY
name
UNION ALL
SELECT
name, 'data' AS metric_name, SUM(data) AS metric_value
FROM
table3
WHERE
date > '2017-01-01 00:00:00'
GROUP BY
name
UNION ALL
.
.
.)
GROUP BY
name, metric_name)
GROUP BY
name
ORDER BY
name ASC
LIMIT 0,20;
第一个子查询返回大量数据的,所以我想我可以指望它并返回作为一个列值,或行,它会传播到主选择限制20个结果。因为我需要知道整个结果集,但不希望两次调用同一个查询而没有限制,仅限于获取COUNT。至少有12个UNION ALL三级子选择,为什么浪费资源。我期待尝试通用SQL解决方案不一定与ClickHouse
我想使用count(*) OVER()
,但不支持,所以如果这只是选项,我知道我需要运行查询两次。
是否SQL_CALC_FOUND_ROWS帮助吗?这个场景就是它的设计目的。您使用该选项运行查询,然后SELECT FOUND_ROWS()将为您提供LIMIT应用之前的总行数(不需要再次运行查询)。 https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows – EdmCoff
您可能想要加入相同的联合子查询,但这次要获得结果数。 – Lamar
感谢您的评论,我不知道SQL_CALC_FOUND_ROWS存在。它可以解决问题,任何人都可以使用支持该命令的数据库。我正在使用的ClickHouse是基于列的,并且未实现。 – OscarHanzely