-- 分 apptype × 分尾号 × 内外 DAU，含汇总行
-- 尾号定义：rootSessionId 最后一位 hex（与 00_尾号实验 保持一致）
-- 内外定义：rootSourceId 非空 = 外部（从分享/外链进入），空 = 内部
-- GROUPING SETS 一次产出明细 + 汇总：任一列为 'ALL' 表示该维度被聚合
WITH t_base AS
(
    SELECT  dt
            ,apptype
            ,machinecode
            ,SUBSTR(
                GET_JSON_OBJECT(extparams,'$.rootSessionId'),
                LENGTH(GET_JSON_OBJECT(extparams,'$.rootSessionId')),
                1
            ) AS suffix
            ,CASE
                WHEN GET_JSON_OBJECT(extparams,'$.rootSourceId') IS NOT NULL
                 AND GET_JSON_OBJECT(extparams,'$.rootSourceId') <> ''
                THEN '外部'
                ELSE '内部'
             END AS source_type
    FROM    loghubods.useractive_log
    WHERE   dt = "${dt}"
    AND     GET_JSON_OBJECT(extparams,'$.rootSessionId') IS NOT NULL
    AND     GET_JSON_OBJECT(extparams,'$.rootSessionId') <> ''
)
SELECT  dt
        ,COALESCE(apptype,     'ALL') AS apptype
        ,COALESCE(source_type, 'ALL') AS source_type
        ,COALESCE(suffix,      'ALL') AS suffix
        ,COUNT(DISTINCT machinecode)  AS dau
FROM    t_base
GROUP BY dt, apptype, suffix, source_type
GROUPING SETS (
    -- TODO: 选你要的汇总组合，注释掉不需要的行
    (dt, apptype, suffix, source_type),   -- 明细：apptype × 尾号 × 内外
    (dt, apptype, suffix),                -- 某 apptype × 尾号 合计（内外汇总）
    (dt, apptype, source_type),           -- 某 apptype × 内外（尾号汇总）—— 看每个 app 的内外结构
    (dt, apptype),                        -- 某 apptype 全量
    (dt, source_type),                    -- 全 apptype × 内外（看大盘内外占比）
    (dt)                                  -- 当日全量
)
ORDER BY dt, apptype, source_type, suffix
;
