获取总和小于或等于数据集中值的记录
Posted
技术标签:
【中文标题】获取总和小于或等于数据集中值的记录【英文标题】:Fetch records with sum less then or equal to values in dataset 【发布时间】:2021-05-10 00:32:10 【问题描述】:这个问题是这里问题Query to get all records until the sum of column less than or equal a value的延伸
对于表格:项目
slno | item | price |
---|---|---|
1 | item1 | 1000 |
2 | item2 | 2000 |
3 | item3 | 3000 |
4 | item4 | 4000 |
5 | item5 | 5000 |
6 | item6 | 6000 |
表格:值
id | value |
---|---|
1 | 3500 |
2 | 6000 |
3 | 10000 |
4 | 21000 |
获取总和(价格)等于或小于表值中每个数字的项目中的所有记录
结果是
id | item |
---|---|
1 | item1 |
1 | item2 |
2 | item1 |
2 | item2 |
2 | item3 |
3 | item1 |
3 | item2 |
3 | item3 |
3 | item4 |
4 | item1 |
4 | item2 |
4 | item3 |
4 | item4 |
4 | item5 |
4 | item6 |
SELECT slno, item, price
FROM
(
SELECT slno, item, price,
(
SELECT SUM(price)
FROM table1
WHERE slno <= t.slno
) total
FROM table1 t
) q
WHERE total <= 10000
ORDER BY slno
以上解决方案适用于单个值 10000 此解决方案由 https://***.com/users/1920232/peterm 提供
如何获取表中每个值的记录:值
【问题讨论】:
【参考方案1】:使用累积和然后join
:
select v.*, i.*
from (select i.*, sum(price) over (order by slno) as running_price
from items i
) i join
values v
on i.running_price <= v.value
order by v.id, i.slno;
【讨论】:
虽然在这种情况下“over (order by slno)”会起作用,因为 slno 的顺序和价格正在增加,但是在 slno 和价格的随机顺序的情况下,“over (order by price)”是更好的选择。以上是关于获取总和小于或等于数据集中值的记录的主要内容,如果未能解决你的问题,请参考以下文章