查询匹配给定值阈值的最小行数

  • 本文关键字:阈值 查询 sql postgresql ecto
  • 更新时间 :
  • 英文 :


我想创建一个操作类似于收银机的查询。想象一个装满不同大小硬币的收银机。我想检索总额最少的硬币硬币。

给出这个表:

<表类> id 价值 tbody><<tr>110021003500450051000

我自己尝试了一下,使用了之前问题的答案:

  • 使用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;

最新更新