如何将计数值分组到恰好一个、2 到 5、大于 5 的范围内
How to group count values into ranges like exactly one, 2 to 5, more than 5
我有一个 table 的交易,具有可以发送交易的发送方和接收方的概念:
现在我想要得到一个结果集,其中应该包括一定范围内的每个接收者的唯一发件人:
- 一个接收者从 1 个发送者接收
- 一个接收者接收来自 2-5 个发送者的信息
- 一个接收者接收来自 6-10 个发送者的信息
- 一个接收者接收来自 11-20 个发送者的信息
- 一个接收者接收超过 20 个发送者
我已尝试但无法获得所需的结果集。任何人都可以帮助我吗?
这将是一个混乱的评论。您并没有真正提供示例数据和所需的输出(我不接受图片作为示例)。无论如何,你所描述的是一个简单的 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;
创建一个(虚拟的)table 来存储范围,然后将其与聚合数据连接:
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
我有一个 table 的交易,具有可以发送交易的发送方和接收方的概念:
现在我想要得到一个结果集,其中应该包括一定范围内的每个接收者的唯一发件人:
- 一个接收者从 1 个发送者接收
- 一个接收者接收来自 2-5 个发送者的信息
- 一个接收者接收来自 6-10 个发送者的信息
- 一个接收者接收来自 11-20 个发送者的信息
- 一个接收者接收超过 20 个发送者
我已尝试但无法获得所需的结果集。任何人都可以帮助我吗?
这将是一个混乱的评论。您并没有真正提供示例数据和所需的输出(我不接受图片作为示例)。无论如何,你所描述的是一个简单的 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;
创建一个(虚拟的)table 来存储范围,然后将其与聚合数据连接:
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