首页 > 解决方案 > 根据计数均匀分布顺序 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)

标签: sqltsqlssms

解决方案


如果您对粗略估计感到满意,这会将数据分成两组。

第一组总是有尽可能多的记录,但不超过总数的一半(第 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

如果您想要一些可以使两个组的大小尽可能接近的东西,那就要复杂得多。


推荐阅读