You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL报表视图开发:按唯一键获取首次充值日期及对应券码

解决SQL报表视图逻辑问题

核心思路

要实现每个SubscriberID、MSISDN、ICCID唯一键对应单行结果,需先定位每个用户的首次充值日期,再获取该日期下的券码(当日多券码可按需求聚合或选取),同时通过分组或窗口函数确保唯一键仅返回一行。

方案一:分组+关联查询(通用SQL)

先计算每个唯一键的首次充值日期,再关联原表提取当日券码:

WITH first_recharge AS (
    SELECT 
        SubscriberID,
        MSISDN,
        ICCID,
        MIN(RECHARGEDATE) AS first_recharge_date
    FROM your_table_name
    GROUP BY SubscriberID, MSISDN, ICCID
)
SELECT 
    fr.SubscriberID,
    fr.MSISDN,
    fr.ICCID,
    fr.first_recharge_date,
    -- 多券码拼接:MySQL用GROUP_CONCAT,PostgreSQL用STRING_AGG,SQL Server用STRING_AGG
    STRING_AGG(t.VOUCHERCODE, ', ') AS first_day_voucher_codes
FROM first_recharge fr
JOIN your_table_name t 
    ON fr.SubscriberID = t.SubscriberID
    AND fr.MSISDN = t.MSISDN
    AND fr.ICCID = t.ICCID
    AND fr.first_recharge_date = t.RECHARGEDATE
GROUP BY fr.SubscriberID, fr.MSISDN, fr.ICCID, fr.first_recharge_date;

方案二:窗口函数(支持窗口函数的数据库)

若只需取首次充值日的任意一个券码,用窗口函数标记首行即可:

WITH ranked_recharges AS (
    SELECT 
        SubscriberID,
        MSISDN,
        ICCID,
        VOUCHERCODE,
        RECHARGEDATE,
        ROW_NUMBER() OVER (
            PARTITION BY SubscriberID, MSISDN, ICCID 
            ORDER BY RECHARGEDATE ASC, VOUCHERCODE ASC
        ) AS rn
    FROM your_table_name
)
SELECT 
    SubscriberID,
    MSISDN,
    ICCID,
    VOUCHERCODE AS first_voucher_code,
    RECHARGEDATE AS first_recharge_date
FROM ranked_recharges
WHERE rn = 1;

原查询问题说明

原查询未添加GROUP BY SubscriberID, MSISDN, ICCID,且部分数据库中'first'()函数用法不规范(如Snowflake中应为窗口函数FIRST_VALUE()而非聚合函数),导致无法按唯一键聚合,因此返回多行结果。

内容的提问来源于stack exchange,提问作者Debbie Dippenaar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:30:46