使用SQL平均分布对象

使用SQL平均分布对象,sql,oracle,Sql,Oracle,我的数据如下 |Fruit |Numbers| |Apples | 50| |Banana | 30| |Oranges | 20| |Grapes | 100| |Peach | 30| |Kiwi | 70| 我需要重新安排他们3袋这样我有3袋相等(或几乎)数量的水果使用NTILE。你能帮忙吗 输出应该是 |Bag_id|Contents |Count |Bag 1 | Apples,Oranges,Peach

我的数据如下

|Fruit   |Numbers|
|Apples  |     50|
|Banana  |     30|
|Oranges |     20|
|Grapes  |    100|
|Peach   |     30|
|Kiwi    |     70|
我需要重新安排他们3袋这样我有3袋相等(或几乎)数量的水果使用NTILE。你能帮忙吗

输出应该是

|Bag_id|Contents        |Count
|Bag 1 | Apples,Oranges,Peaches|100|
|Bag 2 | Kiwi,Banana    |100|
|Bag 3 |Grapes|100|

如果您只想在每个篮子里放两个水果(忽略
数字
列),那么您可以使用
ntile()

与您的示例结果一样,
数字的总和在篮子中甚至不近似相等。

选择
SELECT
  i.*,
  CASE WHEN item <= 3 THEN item ELSE 7 - item END  AS bag
FROM
(
  SELECT
    b.*,
    ROW_NUMBER() OVER (PARTITION BY batch, ORDER BY numbers) AS item
  FROM
  (
    SELECT
      t.*,
      NTILE(6) OVER (ORDER BY numbers) AS batch
    FROM
      your_table t
  )
    b
)
  i
i、 *,
例当item我有约300个水果时,基于@MatBailie,我找到了soln

谢谢大家

选择Wm_concat(水果),

从(选择i.)。,
案例

什么时候它为什么必须使用ntile?它必须给出准确的结果吗?如果你需要准确的结果,使用了什么算法?如果你能够使用其他算法,你的约束条件是什么?你的输出如何满足水果数量几乎相等的条件?我现在基本上在寻找一个解决方案,ntile不是必须的。但是希望看到它使用Ntileth这不是一个SQL问题(不管怎么说也不是太多);这是一个算法问题。您所拥有的是一个非常简单的“负载平衡”示例,对于您所拥有的一个小示例,可以通过考虑所有可能的组合并给每个组合一个“分数”来解决(你还没有定义,但假设它是三个数字的结果集的方差)并选择得分最低的一个。然而,一般的问题非常难,你需要指定什么是“足够好的答案”。在你考虑任何代码之前,难点是数学问题(或者解决方案使用哪种编程语言,无论是SQL还是其他语言)例如,你的约束条件是什么。这完美地解决了你的第二个版本的问题,但没有找到你的第三个版本的问题的最佳解决方案。实际上,没有一个解决方案在不分析所有可能的组合的情况下都能完美地工作。其他算法(如本算法)速度更快,但仅仅是近似值。您有
NTILE(50)
,这意味着25个行李?但是您应该有

SELECT
  i.*,
  CASE WHEN item <= 3 THEN item ELSE 7 - item END  AS bag
FROM
(
  SELECT
    b.*,
    ROW_NUMBER() OVER (PARTITION BY batch, ORDER BY numbers) AS item
  FROM
  (
    SELECT
      t.*,
      NTILE(6) OVER (ORDER BY numbers) AS batch
    FROM
      your_table t
  )
    b
)
  i