【问题标题】:sql constructionsql构造
【发布时间】:2017-10-27 13:22:20
【问题描述】:

这样的问题: 表A包含一个列号用于记录收入,表B包含一个列号用于记录结果。

可能在一个实例中,表 A 记录 3,12,3,25,1,3,表 B 记录 23,1,4。你可以认为我得到了3,12,3,25,1,3的钱,花了23,1,4。

每次我花钱时,通常都会先取数字 3,然后再取 12 才能满足需求(本例中为 3、12、3、25,即 3+12+3+25>23+1+4>3+12 +3)

我想知道的是如何构造一个sql来查询剩下的收入?在上面的示例中,我将得到 25,1,3,是的,还包括 25。

// solution in java code level but no elegant
private List<Integer> example(List<Integer> aList, List<Integer> bList){
    int sumB = bList.stream().reduce(0, Integer::sum);
    List<Integer> res = new ArrayList<>();

    int sumA = 0;
    for (int a: aList){
        sumA = sumA + a;
        if (sumA>sumB) res.add(a);
    }
    return res;
}

【问题讨论】:

  • 可以用纯sql以外的语言吗?
  • 我尝试的是获取所有数据并在java代码级别比较这两列,它有效但不优雅,
  • 所以请发布一些代码示例并解释为什么它不优雅/如何改进
  • 我只是想在sql级别得到正确的结果,但我不知道如何构造这种sql
  • 这在独立 sql 中听起来并不简单。某种迭代器可以做到这一点,但在 java 中处理结果要简单一百倍。

标签: mysql sql


【解决方案1】:

如果您的 RDBMS 支持SQL window functions,那么您可以计算表 A 的累积总和,并将其与表 B 的总量进行比较。

select amount
from (
  select id, amount, sum(amount) over (order by id) cummulativeSumA 
  from TableA
) as A
cross join (
  select sum(amount) as totalB from TableB
) as B
where A.cummulativeSumA > B.totalB;

【讨论】:

  • 我用的是mysql,好像不支持over关键字
  • 那么我假设您的 MySql 版本早于 8.0.2。因为我以为they did introduce them to MySql at some point
  • 可以看看这个旧的post 以获得灵感,如何在不能使用窗口函数的 MySql 中获得累积和。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多