如何将计数值分组到恰好 1、2 到 5、超过 5 的范围

Posted

技术标签:

【中文标题】如何将计数值分组到恰好 1、2 到 5、超过 5 的范围【英文标题】:How to group count values into ranges like exactly one, 2 to 5, more than 5 【发布时间】:2021-12-18 17:41:35 【问题描述】:

我有一个包含发送者和接收者概念的交易表,可以发送交易:

现在我想获得一个结果集,其中应该包括每个接收者的一系列唯一发件人:

一个接收者从 1 个发送者接收 一个接收者接收来自 2-5 个发送者的信息 一个接收者接收来自 6-10 个发送者的信息 一个接收者接收来自 11-20 个发送者的信息 一个接收者接收超过 20 个发送者

我已尝试但无法获得所需的结果集。任何人都可以帮助我吗?

【问题讨论】:

您可以使用 select receiver, count(distinct sender) ...。请注意,图片不是很有帮助,您应该提供好的样本作为文本和所需的输出。 @CetinBasoz 我将如何获得只有一个发送者的接收者?如果我能弄清楚这一点,其他查询将有类似的模式。 我在这里删除了各种版本标签(其中一个是 2 年多以来不支持的版本)。标记您正在使用的版本很有用,但我怀疑您同时使用所有 3 个版本。 【参考方案1】:

作为评论,这将是一团糟。您并没有真正提供示例数据和所需的输出(我不接受图片作为示例)。无论如何,您所描述的是一个简单的 count():

select receiver, count(distinct sender) senderCount
from myTable
group by receiver
order by count(distinct sender);

会的。将结果放入像 1、2-5、... 这样的存储桶中可以通过不同的方式完成。即:

with counts(receiver, senderCount) as
(
    select receiver, count(distinct sender)
    from myTable
    group by receiver
)
select receiver,
    case 
      when senderCount = 1 then '1'
      when senderCount > 1 and senderCount <= 5 then '2-5'
      when senderCount > 5 and senderCount <= 10 then '6-10'
      when senderCount > 10 and senderCount <= 20 then '11-20'
      when senderCount > 20 then 'Over 20'
    end as individualGroup
from counts; 

【讨论】:

您还需要按相同的case 表达式进行分组 @SalmanA,你说的是哪个 case 表达式?我没有看到这样的列(反正我没有看到表结构,而是从第一张图片中扣除)。 它将返回诸如1, 2-5, 2-5, 11-20(4行)之类的数据,并且OP希望它聚合1: 1, 2-5: 2, 11-20: 1(3行) @SalmanA,你确定吗?哪里写的? 非常感谢@CetinBasoz,在查看了关于您的答案的讨论后,我得到了这个想法并解决了这个问题。抱歉没有正确解释【参考方案2】:

创建一个存储范围的(虚拟)表,然后将其与聚合数据连接:

SELECT ranges.*, COUNT(*) AS ReceiversInRange --, other aggregates
FROM (VALUES
    (1,  1,  1, 'Low risk'),
    (2,  2,  5, 'Low risk'),
    (3,  6, 10, 'Medium risk'),
    (4, 11, 20, 'Medium-high'),
    (5, 20, NULL, 'High risk')
) AS ranges(id, lb, ub, label)
INNER JOIN (
    SELECT COUNT(DISTINCT Sender) AS SenderCount --, other aggregates
    FROM t
    GROUP BY Receiver 
) AS aggdata ON SenderCount >= lb AND (SenderCount <= ub OR ub IS NULL)
GROUP BY id, lb, ub, label

【讨论】:

以上是关于如何将计数值分组到恰好 1、2 到 5、超过 5 的范围的主要内容,如果未能解决你的问题,请参考以下文章

SAS中如何分组计数,并将值保存到宏变量

如何使用 dplyr 将跨因子级别的分组计数保存到新变量中?

对超过百万行进行排序的分组

如何将时间列分别分组为 5 分钟间隔和最大值/最小值 SQL?

jmeter中计数器的使用

在 jQuery 中按数据属性对 HTML 元素进行分组和计数