【问题标题】:How to get group ranking list (rank by member count) from SQL Server?如何从 SQL Server 获取组排名列表(按成员数排名)?
【发布时间】:2016-11-14 21:19:35
【问题描述】:

我有 2 个这样描述的表:

表成员

MemberID | GroupID
1        | 101
2        | 104
3        | 107
4        | 102
5        | 103
6        | 104
7        | 105
8        | 106
......

表组(组是嵌套的)

GroupID | ParentID
101     | NULL
102     | NULL
103     | 111
104     | 101
105     | 102
106     | 105
107     | NULL
......

现在我想从数据库中获取 TOP 10 个成员最多的组,我该如何编写我的 SQL 查询?

请注意:

  1. 总成员数应包含子组成员数

  2. 一个组可以拥有无​​限级别的子组(例如 parent -> subLv1 -> subLv2 ...)

对于上面的例子,期望的结果是:

Rank | GroupID | MemberCount
1    | 102     | 3
2    | 101     | 2
3    | 105     | 2
4    | 103     | 1
5    | 104     | 1
....

【问题讨论】:

  • 编辑您的问题并提供示例结果(和相应的示例数据)。

标签: sql sql-server


【解决方案1】:

试试这个(语法未完全检查):

SELECT GROUP_ID, SUM(Y) AS Z
   FROM ( SELECT GroupID AS GROUP_ID, COUNT(*) AS Y
            FROM MEMBER
          GROUP BY GroupID
          UNION
          SELECT ParentID AS GROUP_ID, COUNT(*) AS Y
            FROM GROUP
          GROUP BY ParentID 
        )
GROUP BY GROUP_ID
ORDER BY Z DESC;

然后,您可以对检索到的记录数添加限制。

【讨论】:

  • TY,但似乎此查询要求组只有 1 个子级别?我的组表定义了一个嵌套组结构,如树@FDavidov
  • 你的意思是任何节点,在任何级别,都应该包括孩子,孙子,祖孙,...的总数?
  • 没错!这对我来说是一项艰巨的任务。 @FDavidov
  • 好吧,既然您对层次结构的深度一无所知,唯一的选择是:(1) 编写递归查询(在 ORACLE 中可用,显然在 SQL 中也可用-Server)或实现递归函数。我建议您尝试两者中的任何一个并重新发布此问题(使用新解决方案)或创建一个新问题。对不起。
猜你喜欢
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多