いくつかのUNION ALLを集計するサブクエリがあります。私はSELECT
を用意してクロスタブを作成し、20とするように制限しています。メインクエリで制限する前に、サブクエリ結果の合計COUNTを取得できるようにしたいと考えています。これは、レコードの総数とそれに続く特定のページレコードグリッドを受け取るページネーションを作成しようとするためです。LIMIT(クリックハウス)を適用する前のサブクエリの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;
第一副選択は、データのトンを返すので、私はそれをカウントし、1つの列値として返し、又は行とそれが20の結果を制限選択主に伝搬することができると思いました。私は結果の全セットを知っている必要があるが、ドントを知る必要があるので、同じクエリを制限なしに2回呼び出すだけで、COUNTを得るには限界がある。少なくとも12のUNION ALLの第3レベルのサブ選択があるので、なぜ無駄なリソースですか。私は一般的な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_foundrows – EdmCoff
同じユニオンのサブクエリに参加したいかもしれませんが、今度は結果の数を取得してください。 – Lamar
ご意見ありがとうございました。私はSQL_CALC_FOUND_ROWSが存在するかどうか分かりませんでした。コマンドをサポートしているデータベースを使用している人にとって、この問題は解決します。私が使用しているClickHouseは列ベースであり、実装されていません。 – OscarHanzely