【问题标题】:How to count total for groups by each student id [closed]如何按每个学生ID计算组的总数[关闭]
【发布时间】: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 代码。 谢谢

【问题讨论】:

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

标签: sql sql-server tsql group-by


【解决方案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;
      

      【讨论】:

      • 为什么都是粗体?你在喊吗!?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      相关资源
      最近更新 更多