sql - 对行进行分组,使每列的总和不超过 10
问题描述
我有一个看起来像的表:
col1
------
2
2
3
4
5
6
7
值按升序排序。
我想将每一行分配给标签为 0,1,...,n 的组,以便每个组的总数不超过 10。所以在上面的示例中,它看起来像这样:
col1 |label
------------
2 0
2 0
3 0
4 1
5 1
6 2
7 3
我尝试使用这个:
floor(sum(col1) OVER (partition by ORDER BY col1 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) /10))
但这不能正常工作,因为它正在执行以下操作:
floor(2/10) = 0
floor([2+2]/10) = 0
floor([2+2+3]/10) = 0
floor([2+2+3+4]/10) = 1
floor([2+2+3+4+5]/10 = 1
floor([2+2+3+4+5+6]/10 = 2
floor([2+2+3+4+5+6+7]/10) = 2
巧合的是,直到最后一次计算之前都是正确的,因为即使
[2+2+3+4+5+6+7] / 10 = 2.9
和
floor(2.9) = 2
它应该做的是实现 6+7 > 10,因此值为 7 的第 5 行需要在其自己的组中,因此迭代组号 + 1 并将该行分配到一个新组中。
我真正想要它做的是当它遇到一个和> 10然后设置组号=组号+ 1,将当前行分配到这个新组中,然后最后将新的开始行设置为当前行。
解决方案
评论太长了。
解决这个问题需要逐行扫描表。在 SQL 中,这将通过递归 CTE(或分层查询)。Hive 都不支持这些。
问题是每次定义一个组时,10 和总和之间的差值被“遗忘”。也就是说,当您在列表中更靠后时,较早发生的事情并不是对可用数据的简单累积。您需要知道它是如何分组的。
一个相关的问题是可以解决的。相关问题会将所有行分配给大小为 10 的组,将行拆分为两组。然后,您将仅根据前一行的累积总和知道后一行所在的组。
推荐阅读
- android - 收缩时发现的警告,请使用 -dontwarn 或 -ignorewarnings 抑制它们
- android - 如何实现多个“图像添加”布局?
- linux - 如何以垂直顺序回显变量
- paypal - Paypal 用户对用户支付是可能的吗?
- java - 创建一个新的对象类或编写一个转换子类对象的方法?或者是其他东西?性能不是偏好
- javascript - 同时隐藏和显示 bootstrap 4 modal 将隐藏浏览器的滚动条
- javascript - 使用 javascript 嵌入 Youtube 视频的 Cookie 同意,以符合 GDPR
- python - 如何使用“iloc”和“loc”方法代替 .ix 方法进行索引切片让我们只是说获取特定时间范围之间的数据?
- python - Python:直方图 - 创建 uequal bins/axis
- python - 在python中对字典的字母数字值进行排序