使用 CTE 时如何保留行数?

问题描述 投票:0回答:1

我有以下 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

如何修改查询以保留行数?

sql common-table-expression clickhouse
1个回答
0
投票

尝试对 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
© www.soinside.com 2019 - 2024. All rights reserved.