Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按分区计算不同的_Sql_Sql Server_Count_Window Functions - Fatal编程技术网

Sql 按分区计算不同的

Sql 按分区计算不同的,sql,sql-server,count,window-functions,Sql,Sql Server,Count,Window Functions,我正在尝试对根据角色划分的名称进行一次独特的计数。因此,在下面的示例中:我有一个包含姓名和角色的表 我想要一个角色计数列,给出该角色中不同人员的总数。例如,角色经理出现了四次,但该角色只有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

我正在尝试对根据角色划分的名称进行一次独特的计数。因此,在下面的示例中:我有一个包含姓名和角色的表

我想要一个角色计数列,给出该角色中不同人员的总数。例如,角色经理出现了四次,但该角色只有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
包括date列之后,它将计算角色总数,而不是按我知道在分区中没有标识的不同名称。提供4名经理和3名分析师

我该如何解决这个问题

期望输出:

日期 名称 角色 角色计数 01/01 山姆 经理 3. 02/01 山姆 经理 3. 01/01 约翰 经理 3. 01/01 丹 经理 3. 01/01 上下快速移动 分析师 2. 02/01 上下快速移动 分析师 2. 01/01 迈克 分析师 2. 遗憾的是,COUNTDISTINCT不能作为窗口聚合使用。但我们可以使用稠密_秩和MAX的组合来模拟它:

选择 a、 名字, a、 角色, 按日期划分的分区上的MAXrnk,角色作为角色\u计数 从…起 选择*, 按日期划分的分区上的密级,按名称划分的角色顺序为rnk 从桌子上 A. 如果名称可能为空,则我们需要考虑:

选择 a、 名字, a、 角色, MAXCASE当名称不为NULL时,则rnk按日期结束分区,角色作为角色\u计数 从…起 选择*, 按日期、角色、大小写在分区上的稠密_排名,当名称为NULL时,则为0,否则为1,按名称作为rnk结束排序 从桌子上 A. 遗憾的是,COUNTDISTINCT不能作为窗口聚合使用。但我们可以使用稠密_秩和MAX的组合来模拟它:

选择 a、 名字, a、 角色, 按日期划分的分区上的MAXrnk,角色作为角色\u计数 从…起 选择*, 按日期划分的分区上的密级,按名称划分的角色顺序为rnk 从桌子上 A. 如果名称可能为空,则我们需要考虑:

选择 a、 名字, a、 角色, MAXCASE当名称不为NULL时,则rnk按日期结束分区,角色作为角色\u计数 从…起 选择*, 按日期、角色、大小写在分区上的稠密_排名,当名称为NULL时,则为0,否则为1,按名称作为rnk结束排序 从桌子上 A.
不幸的是,SQL Server和其他数据库也不支持COUNTDISTINCT作为窗口函数。幸运的是,有一个简单的技巧可以解决这个问题——稠密_秩之和减去1:

select a.Name, a.Role,
       (dense_rank() over (partition by a.Role order by a.Name asc) +
        dense_rank() over (partition by a.Role order by a.Name desc) -
        1
       ) as distinct_names_in_role
from table a
group by a.name, a.role

不幸的是,SQL Server和其他数据库也不支持COUNTDISTINCT作为窗口函数。幸运的是,有一个简单的技巧可以解决这个问题——稠密_秩之和减去1:

select a.Name, a.Role,
       (dense_rank() over (partition by a.Role order by a.Name asc) +
        dense_rank() over (partition by a.Role order by a.Name desc) -
        1
       ) as distinct_names_in_role
from table a
group by a.name, a.role

我的名字。。。而不是counta。Role@gofrCOUNTDISTINCT。。。结束SQL Server`@Charlieface中不可用哦,他们仍然没有使用它。。。我的糟糕等待让我直截了当地说:如果只有两行,Sam如何拥有角色\ u计数3?换句话说:为什么要使用窗口聚合,为什么不使用常规聚合?我们能得到样本输入数据吗?@Charlieface我想要这个角色中所有不同的人。因此,Sam在两个不同的日期出现两次,但无论他出现多少次,仍然只有3位独特的经理。示例数据是没有角色计数列的同一个表。COUNTDISTINCT a.Name。。。而不是counta。Role@gofrCOUNTDISTINCT。。。结束SQL Server`@Charlieface中不可用哦,他们仍然没有使用它。。。我的糟糕等待让我直截了当地说:如果只有两行,Sam如何拥有角色\ u计数3?换句话说:为什么要使用窗口聚合,为什么不使用常规聚合?我们能得到样本输入数据吗?@Charlieface我想要这个角色中所有不同的人。因此,Sam在两个不同的日期出现两次,但无论他出现多少次,仍然只有3位独特的经理。示例数据是相同的表,没有角色计数列。您好,感谢您的回复。当只有唯一的名称时,这可以很好地工作。日期列多次重复名称,因此导致此密集的秩计数超过重复次数。我在示例代码中添加了一个.dateclarify@BaronG . . . 不,这个有效。这就是问题的关键所在。如果你摆好一把小提琴,我可以举例说明。嗨,谢谢你的回复。当只有唯一的名称时,这可以很好地工作。日期列多次重复名称,因此导致此密集的秩计数超过重复次数。我在示例代码中添加了一个.dateclarify@BaronG . . . 不,这个有效。这就是问题的关键所在。如果你设置了一个dbfiddle,我可以举例说明。嗨,我还需要a.date列的唯一性。好的,我想你现在明白了。嗨,我还需要a.date列的唯一性。好的,我想你现在明白了