如何按每个学生ID计算组的总数[关闭]

Posted

技术标签:

【中文标题】如何按每个学生ID计算组的总数[关闭]【英文标题】:How to count total for groups by each student id [closed] 【发布时间】:2021-10-23 06:31:36 【问题描述】:
GROUP        STUDENT    COUNT OF GROUP FOR EACH STUDENT
GROUP A      ST 1       1
GROUP A      ST 2       2
GROUP B      ST 2       2
GROUP A      ST 3       2
GROUP B      ST 3       2
GROUP B      ST 3       2

如何计算一个学生进入一个小组的次数。 前任。 ST 1 只有一个 A 组条目,但 ST2 和 ST3 有 2 个组条目,与行无关。

请任何人帮助这个 SQL 代码。 谢谢

【问题讨论】:

根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。并且请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 【参考方案1】:

理想情况下,您希望 count(distinct) 作为窗口函数:

select t.*, 
       count(distinct group) over (partition by student) as cnt_group
from t;

但 SQL Server 不支持窗口函数中的distinct。相反,您可以使用dense_rank() 的总和解决方法:

select t.*,
       (-1 + 
        dense_rank() over (partition by student order by group asc) +
        dense_rank() over (partition by student order by group desc)
       ) as num_groups
from t;

【讨论】:

【参考方案2】:

这是你找到所有关系的方法

SELECT DISTINCT [GROUP], STUDENT
FROM yourtable

现在,让我们汇总一下

SELECT COUNT(*)
FROM (
    SELECT DISTINCT [GROUP], STUDENT
    FROM yourtable
) t
GROUP BY STUDENT;

【讨论】:

【参考方案3】:

用窗口函数伪造COUNT(DISTINCT 的另一种方法是使用DENSE_RANK,然后使用MAX 窗口函数

SELECT
  t.student,
  t.[group],
  CountGroups = MAX(rnk) OVER (PARTITION BY t.student)
FROM (
    SELECT *,
      rnk = DENSE_RANK() OVER (PARTITION BY t.student ORDER BY t.[group])
    FROM t
) t;

【讨论】:

为什么都是粗体?你在喊吗!?

以上是关于如何按每个学生ID计算组的总数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rest 中暴露服务? [关闭]

SQL加入多个子查询 - 按日期计算打开/关闭

如何创建 SQL 查询来计算按日期分组和连接的项目? [关闭]

java存储从文件到数组的整数输入[关闭]

在计算百分比时将 Over() 与聚合函数一起使用

每个程序员都应该了解安全性啥? [关闭]