【问题标题】:SQL / Django views conditional cumulative sum of valuesSQL / Django 查看条件累积值的总和
【发布时间】:2022-01-27 01:04:22
【问题描述】:

SQL 和 Django 的新手,如果 B 列(字符串)中的值不同,我正在尝试创建一个查询来累积 A 列(整数)的值。应根据日期(C 列)进行此累积。

这是数据:

Column A Column B Column C 
2.0      Rock     2020-08-08
3.0      Paper    2020-09-08
25.0     Rock     2021-09-09
12.0     Rock     2021-10-10
5.0      Paper    2021-11-11

根据这些数据,我想要第三列 D,它代表累积值,如下所示:

Column A    Column B Column C    Column D
2.0         Rock     2020-08-08  2.0
3.0         Paper    2020-09-08  5.0
25.0        Rock     2021-09-09  28.0
12.0        Rock     2021-10-10  15.0
5.0         Paper    2021-11-11  17.0

【问题讨论】:

  • ColumnC 列包含重复的日期。这意味着行的顺序不是唯一定义的。
  • 不清楚“如果 B 列不同”是什么意思...
  • 很抱歉给您带来了困惑。我的意思是,如果在 B 列中找到一个以前已经存在的字符串,那么只有最新字符串(B 列)的值(A 列)将用于累积和。当我们找到第一个Paper记录时,累积和是Paper(3)和Rock(2)所以和为5。下一条记录,Rock的值变为25,所以累积和为28(25+3),和很快。它更有意义吗?

标签: sql django sqlite django-views window-functions


【解决方案1】:

如果您想要查询,可以使用自联接和FIRST_VALUE() 窗口函数:

SELECT DISTINCT t1.*, 
       t1.ColumnA + COALESCE(FIRST_VALUE(t2.ColumnA) OVER (PARTITION BY t1.ColumnC ORDER BY t2.ColumnC DESC), 0) ColumnD
FROM tablename t1 LEFT JOIN tablename t2
ON t2.ColumnC < t1.ColumnC AND t2.ColumnB <> t1.ColumnB
ORDER BY t1.ColumnC;

请参阅demo

【讨论】:

  • @forpass,如果我要在原始数据中有另一列(带字符串),我应该修改什么才能使您的查询正常工作?
  • @MBtor t1.* 返回表的所有列,所以我相信代码应该按原样工作,但如果没有示例数据和预期结果,我无法确定。
  • 感谢您的回答,但它对我不起作用。如果您能看一下,我将不胜感激。为此,我应该修改这篇文章中的数据,还是应该创建另一个数据,以便您的答案在这里保持有效?
  • @MBtor 我的代码返回您的预期结果,如您在我提供的演示中所见,以及您在问题中描述的逻辑。如果您的要求不同,您应该发布一个新问题,用示例数据和预期结果解释您想要什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多