【发布时间】:2021-05-26 15:09:08
【问题描述】:
我正在尝试对按角色划分的名称进行不同的计数。因此,在下面的示例中:我有一个包含姓名和人员角色的表格。
我想要一个角色计数列,该列提供该角色中不同人员的总数。例如,角色经理出现了四次,但该角色只有 3 个不同的人 - Sam 在不同的日期再次出现。
如果我删除日期列,它可以正常使用:
select
a.date,
a.Name,
a.Role,
count(a.Role) over (partition by a.Role) as Role_Count
from table a
group by a.date, a.name, a.role
包括日期列然后使其计算角色总数而不是按不同的名称(我知道我没有在分区中标识)。给 4 名经理和 3 名分析师。
我该如何解决这个问题?
期望的输出:
| Date | Name | Role | Role_Count |
|---|---|---|---|
| 01/01 | Sam | Manager | 3 |
| 02/01 | Sam | Manager | 3 |
| 01/01 | John | Manager | 3 |
| 01/01 | Dan | Manager | 3 |
| 01/01 | Bob | Analyst | 2 |
| 02/01 | Bob | Analyst | 2 |
| 01/01 | Mike | Analyst | 2 |
当前输出:
| Date | Name | Role | Role_Count |
|---|---|---|---|
| 01/01 | Sam | Manager | 4 |
| 02/01 | Sam | Manager | 4 |
| 01/01 | John | Manager | 4 |
| 01/01 | Dan | Manager | 4 |
| 01/01 | Bob | Analyst | 3 |
| 02/01 | Bob | Analyst | 3 |
| 01/01 | Mike | Analyst | 3 |
【问题讨论】:
-
COUNT(DISTINCT a.Name) ...而不是count(a.Role) -
@gofr
COUNT(DISTINCT...) OVER...在 SQL Server 中不可用` -
@Charlieface 哦,他们仍然没有用它做任何事情......我的错
-
等一下,让我明白这一点:如果只有两行,
Sam的 Role_count 是怎样的?换句话说:你为什么要使用窗口聚合,为什么不使用常规聚合?我们可以有样本输入数据吗? -
@Charlieface 我希望所有不同的人都担任这个角色。所以 Sam 在两个不同的日期出现了两次,但无论他出现多少次,仍然只有 3 个唯一的经理。示例数据是没有角色计数列的同一张表。
标签: sql sql-server count window-functions