昨天有个朋友遇到一个问题:
单据根据创建时间倒序排序
累计单据金额等于或者超过1000时停止查询,返回查出来的数据
然后我提供了一个mysql的方式,但是他说他使用的是Oracle的数据库,尴尬!
Mysql的实现方法
模拟一个场景
通过序列号倒序排序
累计数字字段,当累计和大于等于100时停止查询
提供表数据如下:

这里通过over函数实现逐行累计;
SELECT
T1.*
FROM
( SELECT ID, NUM, sum( NUM ) over ( ORDER BY "INDEX" DESC ) val, "INDEX" FROM "TEST_NUM" ) T1
WHERE
( T1.val - NUM ) < 100
查询结果如下:

这就完成了需求了。
但是上面的只有一种,如果多种呢?
这里要知道over的第二个参数分区partition BY
现在有多种类别的数据,分别实现上面的逻辑,数据库如下:

使用分区参数对TYPE分区,这次改成60:
SELECT
T1.*
FROM
( SELECT ID, NUM, "TYPE", sum( NUM ) over ( partition BY TYPE ORDER BY "INDEX" DESC ) val, "INDEX" FROM "TEST_NUM" ) T1
WHERE
( T1.val - NUM ) < 60
查询结果如下:

这样就完成了多种的分类处理了。

本文介绍了如何在Oracle数据库中,根据创建时间倒序排序单据,并在累计金额达到特定阈值时停止查询。通过使用窗口函数`OVER()`的`PARTITION BY`和`ORDER BY`子句,可以实现对不同类型数据的分类累计。示例展示了如何在不同类别下,当累计数值达到60时,返回相应的查询结果。这种方法对于大数据量的分组查询非常实用。
750

被折叠的 条评论
为什么被折叠?



