从表中选择行,使其列的计算值总和小于给定限制

Posted

技术标签:

【中文标题】从表中选择行,使其列的计算值总和小于给定限制【英文标题】:Select rows from table such that sum of computed values of their column is less than given limit 【发布时间】:2013-11-20 16:52:52 【问题描述】:

我有一个如下结构的表 myTable:

id: int PRIMARY KEY
number: int

我想在条件下从myTable中最多随机选择3行:

    最多应该选择三行 我们应该选择 id 和计算为0,3*RAND()*number 的值转换为INT。计算列的别名是randomValue 只有带有randomValue>0 的行应该包含在结果中 randomValues 的总和应小于给定的阈值,例如 60。

到目前为止,我已经写了这个:

SELECT TOP 3 id,randomValue
            FROM(
                SELECT id, CONVERT(INT,(0.3*RAND()*number)) AS randomValue
                FROM myTable
                WHERE number>0
            ) AS D
            WHERE randomValue>0
            ORDER BY NEWID()

上面的代码最多选择 3 个 randomValue 大于零的随机行。但是,我不知道如何满足条件 4,即如何使所选行中的 randomValues 总和小于 60。

这是我正在测试解决方案的 myTable:

【问题讨论】:

我没有试过你的查询。但我不建议使用子查询。您必须使用 ROW_Number()。示例语法如下。 ROW_NUMBER() OVER(PARTITION BY [ColumnName] ORDER BY ColumnValue Desc as [CountColumn] 【参考方案1】:
WITH
  random_values AS (
    SELECT
      id,
      CONVERT(INT,(0.3*RAND()*number)) AS randomValue
    FROM myTable
    WHERE number>0
  ),
  valid_sets AS (
    SELECT
      t1.id id1,
      t2.id id2,
      t3.id id3
    FROM random_values t1
    INNER JOIN random_values t2 ON (t2.id > t1.id)
    INNER JOIN random_values t3 ON (t3.id > t2.id)
    WHERE t1.randomValue + t2.randomValue + t3.randomValue < 60
  )
SELECT c.id,c.number
FROM (SELECT TOP 1 * FROM valid_sets ORDER BY NEWID()) a
UNPIVOT(id FOR n IN (id1,id2,id3)) b
INNER JOIN myTable c ON (b.id = c.id)

【讨论】:

以上是关于从表中选择行,使其列的计算值总和小于给定限制的主要内容,如果未能解决你的问题,请参考以下文章

从表中返回加起来达到最大给定值的项目

推动从表中选择一列

从表中随机选择行 - Python Pandas 读取 SQL

如何从表中选择主键列?

仅从表中选择最新记录并使其快速,如何?

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值