具有分组聚合的SQL计数
我正在尝试编写一个SQL查询,它允许我用历史数据创建一个折线图。我想知道每天有多少用户在使用我的应用程序。我的Y轴将是100个应用程序中使用率的百分比,X轴是一天,每个构建都是一条不同的线。在任何时候,所有行的总和都应等于100% 由于此查询应按版本/内部版本进行分组,因此除了日期之外,我还试图找出如何获取查询中任何给定日期的总用户百分比。到目前为止,我能够得到以下查询:具有分组聚合的SQL计数,sql,clickhouse,Sql,Clickhouse,我正在尝试编写一个SQL查询,它允许我用历史数据创建一个折线图。我想知道每天有多少用户在使用我的应用程序。我的Y轴将是100个应用程序中使用率的百分比,X轴是一天,每个构建都是一条不同的线。在任何时候,所有行的总和都应等于100% 由于此查询应按版本/内部版本进行分组,因此除了日期之外,我还试图找出如何获取查询中任何给定日期的总用户百分比。到目前为止,我能够得到以下查询: SELECT DISTINCT sub.Version, sub.Build, sub
SELECT DISTINCT
sub.Version,
sub.Build,
sub.app_id,
sub.Users,
sub.`day`,
(
SELECT COUNT(DISTINCT user_id)
FROM snowplow_enricher_good seg
) AS Total,
(sub.Users/Total) * 100 AS Percent
FROM
(
SELECT
visitParamExtractString(seg.contexts, 'version') AS Version,
visitParamExtractString(seg.contexts, 'build') AS Build,
seg.app_id,
seg.`day`,
CONCAT(
Version,
' (',
Build,
')'
) AS AppBuildVersion,
COUNT(DISTINCT seg.user_id) AS Users
FROM snowplow_enricher_good seg
GROUP BY Version, Build, app_id, `day`
ORDER BY Users DESC
) AS sub
WHERE sub.app_id = 'APPID';
请注意,当前显示的百分比是所有天数的百分比,而不是单个天数的百分比。我尝试在自定义FROM语句中创建WHERE子句,但失败了
提前感谢:groupArray
SELECT
totalCnt,
totalSum,
ga.1 AS tag,
ga.2 AS value,
(value / totalSum) * 100 AS percent
FROM
(
SELECT
count() AS totalCnt,
sum(value) AS totalSum,
groupArray((tag, value)) AS ga
FROM
(
SELECT
tag,
value
FROM
(
SELECT
[1, 2, 3, 4, 5] AS tag,
[10, 100, 50, 100, 40] AS value
)
ARRAY JOIN
tag,
value
)
)
ARRAY JOIN ga
┌─totalCnt─┬─totalSum─┬─tag─┬─value─┬────────────percent─┐
│ 5 │ 300 │ 1 │ 10 │ 3.3333333333333335 │
│ 5 │ 300 │ 2 │ 100 │ 33.33333333333333 │
│ 5 │ 300 │ 3 │ 50 │ 16.666666666666664 │
│ 5 │ 300 │ 4 │ 100 │ 33.33333333333333 │
│ 5 │ 300 │ 5 │ 40 │ 13.333333333333334 │
└──────────┴──────────┴─────┴───────┴────────────────────┘
通过一系列的连接和子查询,我们能够解决这个问题:
SELECT
day,
app_id,
version,
version_count,
app_count,
(version_count / app_count) * 100 AS percent
FROM (
SELECT
day,
app_id,
visitParamExtractString(contexts, 'version') AS version,
count(DISTINCT user_id) AS version_count
FROM
snowplow_enricher_good
where
day >= subtractDays(today(), 30)
GROUP BY
day,
app_id,
version
)
INNER JOIN (
SELECT
day,
app_id,
count(DISTINCT user_id) AS app_count
FROM
snowplow_enricher_good
WHERE
day >= subtractDays(today(), 30)
GROUP BY
day,
app_id
)
USING
day,
app_id
WHERE
app_id = 'APPID'
ORDER BY
day DESC,
app_id,
version;