我有一个表如下所示。它由许多客户组成(为了简单起见,这里只显示一个客户James),这些客户可以有许多帐户。每个帐户每天都有余额。我的目标是获得每个客户的所有日期,其中总余额(所有帐户)为0。
让我们来看看这个场景。记录从2017年1月1日开始,James有3个活跃账户,余额为44,56,928。第二天2017年1月2日,他的账户2余额变为0。第二天3日,他的账户1和3也变为0,因此在3日,他的总余额第二天4号,他的账户2余额回到435。然后在5号,它回到0,他的TOTAL余额现在,在6日,他具有余额为64的新账户#4。第二天,在7日,该账户#4变为0,并且他的总余额(在所有账户中)再次变为0。
| 客户服务|账号|日期|余额|
| --------------|--------------|--------------|--------------|
| 詹姆斯|1|2017年1月1日|四十四|
| 詹姆斯|二|2017年1月1日|五十六|
| 詹姆斯|三|2017年1月1日|九二八|
| 詹姆斯|1|2017年1月2日|四十四|
| 詹姆斯|二|2017年1月2日|0|
| 詹姆斯|三|2017年1月2日|九二八|
| 詹姆斯|1|2017年3月1日|0|
| 詹姆斯|二|2017年3月1日|0|
| 詹姆斯|三|2017年3月1日|0|
| 詹姆斯|1|2017年4月1日|0|
| 詹姆斯|二|2017年4月1日|四三五|
| 詹姆斯|三|2017年4月1日|0|
| 詹姆斯|1|2017年5月1日|0|
| 詹姆斯|二|2017年5月1日|0|
| 詹姆斯|三|2017年5月1日|0|
| 詹姆斯|1|2017年6月1日|0|
| 詹姆斯|二|2017年6月1日|0|
| 詹姆斯|三|2017年6月1日|0|
| 詹姆斯|四|2017年6月1日|六十四|
| 詹姆斯|1|2017年1月7日|0|
| 詹姆斯|二|2017年1月7日|0|
| 詹姆斯|三|2017年7月1日|0|
| 詹姆斯|四|2017年1月7日|0|
因此,SQL查询的输出应该如下所示(针对每个客户,而不仅仅是James)
| 客户服务|日期归零余额|
| --------------|--------------|
| 詹姆斯|2017年3月1日|
| 詹姆斯|2017年5月1日|
| 詹姆斯|2017年1月7日|
我有下面的代码,但它不看总余额为0。它显示的日期时,余额为每个帐户为0,这不是我想要的:
WITH cte AS (
SELECT
customer
, account
, date
, balance
, LAG(balance) OVER (PARTITION BY customer, account ORDER BY date) AS prev_bal
FROM table
)
SELECT customer, account, date
FROM cte
WHERE balance = 0 AND prev_bal > 0;
2条答案
按热度按时间ebdffaop1#
试试这个:
下面是fiddle:
hlswsv352#
您需要建立每天所有客户帐户的总和,即:
有了这张table,你可以轻松地继续前进。