我有以下 ClickHouse 查询,运行良好:
WITH CTE AS (
SELECT
-- ClickHouse specific JSON function
JSON_QUERY(json, '$.projects[*].userId') as userIds
FROM $table
WHERE
dt BETWEEN toDateTime64($from, 3)
AND toDateTime64($to, 3)
-- ClickHouse specific JSON function
AND JSONHas(json, 'projects')
HAVING userIds != ''
)
SELECT * FROM CTE
它返回以下形式的表格:
userIds
["f72605b9-3a4c-402e-8eec-9dfc61be8ed9"]
["fbb47dda-3026-40e0-9565-a66386905289"]
["fbb47dda-3026-40e0-9565-a66386905289", "334d0921-149b-42da-8c21-8649c3afa2d1"]
["fbb47dda-3026-40e0-9565-a66386905289", "334d0921-149b-42da-8c21-8649c3afa2d1"]
由于 CTE 中的每一行都是字符串类型,我尝试做一个简单的测试,使用
toTypeName
函数返回以下结果:
returnType
String
String
String
String
所以,我像这样修改了我的查询:
WITH CTE AS (
SELECT
JSON_QUERY(json, '$.projects[*].userId') as userIds
FROM $table
WHERE
dt BETWEEN toDateTime64($from, 3)
AND toDateTime64($to, 3)
AND JSONHas(json, 'projects')
HAVING userIds != ''
)
SELECT toTypeName(userIds) FROM CTE
但是,这仅返回一行:
toTypeName(userIds)
String
如何修改查询以保留行数?
尝试对 CTE 结果进行聚合。例如:
WITH CTE AS (
SELECT
-- ClickHouse specific JSON function
JSON_QUERY(json, '$.projects[*].userId') as userIds
FROM $table
WHERE
dt BETWEEN toDateTime64($from, 3)
AND toDateTime64($to, 3)
-- ClickHouse specific JSON function
AND JSONHas(json, 'projects')
HAVING userIds != ''
)
SELECT
count(),
arrayJoin(userIds) AS id
FROM CTE
GROUP BY id