从表中选择行,使其列的计算值总和小于给定限制
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)
【讨论】:
以上是关于从表中选择行,使其列的计算值总和小于给定限制的主要内容,如果未能解决你的问题,请参考以下文章