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

求DAX/Power Query方案:按用户统计其有权限站点的去重访问数

解决方案:按用户权限过滤的站点去重访问数

一、DAX 度量方案(推荐,支持动态用户筛选)

直接创建新度量,先锁定当前用户在TableB中有权限的站点范围,再在TableA中筛选符合条件的访问记录:

Valid Distinct Visits = 
VAR CurrentUser = SELECTEDVALUE('TableA'[UserID])
-- 获取当前用户在TableB中有权访问的站点集合(同时过滤站点类型)
VAR UserAccessibleSites = 
    CALCULATETABLE(
        VALUES('TableB'[SiteID]),
        'TableB'[UserID] = CurrentUser,
        'TableD'[Site Type] IN {"Personal", "Business"}
    )
RETURN
-- 统计TableA中属于该集合且活动类型为Visited的去重站点数
CALCULATE(
    DISTINCTCOUNT('TableA'[SiteID]),
    'TableA'[SiteID] IN UserAccessibleSites,
    'TableC'[Activity] = "Visited"
)

说明:

  • CurrentUser:获取当前上下文的用户(支持切片器筛选单个/多个用户)
  • UserAccessibleSites:生成当前用户有权访问的站点列表,同时加入TableD的站点类型过滤规则
  • 最终计算仅统计TableA中属于该站点列表、且标记为"Visited"的去重站点ID

二、Power Query 预处理方案

如果需要提前整理数据,可通过Power Query合并过滤:

  1. 打开Power Query编辑器,加载TableA、TableB、TableC、TableD
  2. 预处理TableB:
    • 按SiteID合并TableB与TableD,展开Site Type列
    • 筛选Site Type为"Personal"或"Business",仅保留UserID和SiteID列
  3. 按UserID+SiteID内连接TableA与预处理后的TableB,只保留用户有权限的访问记录
  4. 按SiteID合并TableC,筛选Activity为"Visited"
  5. 移除UserID+SiteID的重复组合,最后按UserID分组统计去重站点数

关键M代码片段:

let
    // 过滤TableB的站点类型
    FilteredTableB = Table.SelectRows(
        Table.NestedJoin(TableB, {"SiteID"}, TableD, {"SiteID"}, "TableD", JoinKind.LeftOuter),
        each [TableD][Site Type]{0} = "Personal" or [TableD][Site Type]{0} = "Business"
    ),
    CleanTableB = Table.SelectColumns(FilteredTableB, {"UserID", "SiteID"}),
    // 内连接TableA和CleanTableB,保留用户有权限的访问记录
    JoinedTables = Table.NestedJoin(TableA, {"UserID", "SiteID"}, CleanTableB, {"UserID", "SiteID"}, "CleanTableB", JoinKind.Inner),
    // 过滤访问活动类型
    FilteredVisits = Table.SelectRows(
        Table.NestedJoin(JoinedTables, {"SiteID"}, TableC, {"SiteID"}, "TableC", JoinKind.LeftOuter),
        each [TableC][Activity]{0} = "Visited"
    ),
    // 去重并分组统计
    GroupedStats = Table.Group(
        Table.Distinct(Table.SelectColumns(FilteredVisits, {"UserID", "SiteID"})),
        {"UserID"},
        {{"Valid Visits", each Table.RowCount(_), Int64.Type}}
    )
in
    GroupedStats

原方法无效原因

你之前的计算列InAccessTable? = Contains('TableB', 'TableB'[SiteID], 'TableA'[SiteID])仅全局检查SiteID是否存在于TableB,未关联UserID,会错误统计其他用户有权限的站点,导致结果偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:43:16