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

SQL Server中按账户分组统计唯一会话与用户(跨日期去重)

解决SQL Server中按账户统计唯一用户/会话(避免跨日期重复统计)

我明白你的问题了:现在的查询按日期+账户分组,统计的是当日该账户的独立会话和用户数,但如果同一个用户在该账户下多天登录,每天都会被计入一次,这不是你想要的“真正唯一”统计。你希望保持原查询的结构(保留Date、Account列,方便Power BI做日期筛选),但实现同一个用户/会话在该账户下只被统计一次。

这里有两种思路,分别适合不同的场景:


思路1:SQL查询返回累计唯一值(保持原分组结构)

如果需要在SQL层面直接返回结果,我们可以先找出每个用户、每个会话在对应账户下的首次出现日期,再按日期+账户分组,统计截至当日的累计唯一数量。这样每个用户/会话只会在首次出现的日期及之后的行里被计入一次,不会重复统计。

具体SQL代码如下(记得把YourTable替换成你的表名):

WITH UserFirstActivity AS (
    -- 找出每个用户在对应账户下的首次登录日期
    SELECT Account, user_id, MIN(Date) AS FirstLoginDate
    FROM YourTable
    GROUP BY Account, user_id
),
SessionFirstActivity AS (
    -- 找出每个会话在对应账户下的首次出现日期
    SELECT Account, session_id, MIN(Date) AS FirstSessionDate
    FROM YourTable
    GROUP BY Account, session_id
)
SELECT 
    t.Date,
    t.Account,
    -- 统计截至当前日期,该账户下的累计唯一会话数
    (SELECT COUNT(*) FROM SessionFirstActivity s WHERE s.Account = t.Account AND s.FirstSessionDate <= t.Date) AS number_session,
    -- 统计截至当前日期,该账户下的累计唯一用户数
    (SELECT COUNT(*) FROM UserFirstActivity u WHERE u.Account = t.Account AND u.FirstLoginDate <= t.Date) AS number_users
FROM YourTable t
GROUP BY t.Date, t.Account
ORDER BY t.Date, t.Account;

思路2:在Power BI中用度量值动态计算(更灵活)

如果你的最终目的是在Power BI中让用户自由选择日期范围,然后查看该范围内每个账户的唯一用户/会话总数,更推荐直接在Power BI中创建度量值,不需要修改SQL查询:

  1. 把原始表导入Power BI
  2. 创建两个度量值:
    -- 唯一会话数
    唯一会话数 = DISTINCTCOUNT('YourTable'[session_id])
    -- 唯一用户数
    唯一用户数 = DISTINCTCOUNT('YourTable'[user_id])
    
  3. 当用户在Power BI中选择起止日期后,这两个度量值会自动根据筛选范围,计算每个账户对应的唯一用户/会话数,完全避免重复统计的问题。

为什么你的原始查询会重复统计?因为COUNT(DISTINCT(user_id))是在当日+账户的分组内计算唯一值,同一个用户多天登录会被每天统计一次;而上面的方法要么统计累计的唯一值,要么通过Power BI的筛选动态计算范围内的总唯一值,都能实现你要的“真正唯一”统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:55