我想创建一个操作类似于收银机的查询。想象一个装满不同大小硬币的收银机。我想检索总额最少的硬币硬币。
给出这个表:
<表类>
id
价值
tbody><<tr>1 100 2100 3 500 4500 51000 表类>
我自己尝试了一下,使用了之前问题的答案:
- 使用ABS()按最接近阈值的值排序
- 选择行,直到单个列的和减少达到阈值
根据上面@TheImpaler的注释,这优先考虑最小行数而不是最小超额。这不是我想要的100%,所以如果有人能改进,我愿意改进,但如果不是,我认为这已经足够好了:
-- outer query selects all rows underneath the threshold
-- inner subquery adds a running total column
-- window function orders by the difference between value and threshold
SELECT
*
FROM (
SELECT
i.*,
SUM(i.value) OVER (
ORDER BY
ABS(i.value - $THRESHOLD),
i.id
) AS total
FROM
inputs i
) t
WHERE
t.total - t.value < $THRESHOLD;