sql - 根据计数均匀分布顺序 SQL 结果
问题描述
我有 SQL 结果,需要将其分解为项目范围,并且计数均匀分布在多个任务中。有什么好方法可以做到这一点?
我的数据看起来像这样。
+------+-------+----------+
| Item | Count | ItmGroup |
+------+-------+----------+
| 1A | 100 | 1 |
| 1B | 25 | 1 |
| 1C | 2 | 1 |
| 1D | 6 | 1 |
| 2A | 88 | 2 |
| 2B | 10 | 2 |
| 2C | 122 | 2 |
| 2D | 12 | 2 |
| 3A | 4 | 3 |
| 3B | 103 | 3 |
| 3C | 1 | 3 |
| 3D | 22 | 3 |
| 4A | 55 | 4 |
| 4B | 42 | 4 |
| 4C | 100 | 4 |
| 4D | 1 | 4 |
+------+-------+----------+
项目 = 项目代码。计数 = 这个上下文决定了项目的受欢迎程度。如果需要,这可用于对项目进行排名。ItmGroup - 这是 Itm 列的父值。项目包含在一个组中。
这与我查看过的其他类似问题的不同之处在于,我需要确定的范围不能脱离它们在此表中显示的顺序。我们可以做从 A1 到 B3 的 Item Range,换句话说,它们可以跨越 ItmGroups,但它们必须按 Item 保持字母数字顺序。
预期结果将是均匀分布总计数的项目范围。
+------+-------+----------+
| FrItem | ToItem | TotCount|
+------+-------+----------+
| 1A | 2D | 134 |
| 3A | 3D | 130 |
(etc)
解决方案
如果您对粗略估计感到满意,这会将数据分成两组。
第一组总是有尽可能多的记录,但不超过总数的一半(第 2 组将有其余的)。
WITH
cumulative AS
(
SELECT
*,
SUM([Count]) OVER (ORDER BY Item) AS cumulativeCount,
SUM([Count]) OVER () AS totalCount
FROM
yourData
)
SELECT
MIN(item) AS frItem,
MAX(item) AS toItem,
SUM([Count]) AS TotCount
FROM
cumulative
GROUP BY
CASE WHEN cumulativeCount <= totalCount / 2 THEN 0 ELSE 1 END
ORDER BY
CASE WHEN cumulativeCount <= totalCount / 2 THEN 0 ELSE 1 END
要将数据分成 5 部分,它是相似的......
GROUP BY
CASE WHEN cumulativeCount <= totalCount * 1/5 THEN 0
WHEN cumulativeCount <= totalCount * 2/5 THEN 1
WHEN cumulativeCount <= totalCount * 3/5 THEN 2
WHEN cumulativeCount <= totalCount * 4/5 THEN 3
ELSE 4 END
根据您的数据,这不一定是理想的
Item | Count GroupAsDefinedAbove IdealGroup
------+-------
1A | 4 1 1
2A | 5 2 1
3A | 8 2 2
如果您想要一些可以使两个组的大小尽可能接近的东西,那就要复杂得多。
推荐阅读
- c# - 在 SOLR DB 中,当我执行查询时我有数据,但是当我尝试在代码中执行此操作时,我有一个包含空数据的数组
- google-tag-manager - 自定义模板 callInWindow
- postgresql - PostgreSQL:比较同一列但不同系列(行)中的字符串
- maven - 如何在 Maven 依赖项的另一个 war 文件中添加 jar?
- javascript - 选择 5 张时排队要立即上传的图像
- c# - 如何区分具有相同 id 的两个 WebElement?
- exchangewebservices - 日历 - 对约会应用搜索过滤器(主题)
- vb.net - 如何以另一种语言显示日期时间选择器
- sql - “INSERT INTO ... ON CONFLICT DO NOTHING”在检查约束处停止
- macos - 将 Maven bin 添加到 PATH 变量后获得权限被拒绝问题,也无法在根模式下添加到 PATH