请 sql 老司机来解答解答

2018-12-20 10:25:56 +08:00
 zhangolve

https://segmentfault.com/ 上问了个问题,结果并没有人理。

如何用 postgresql 语句实现数据的累加

2251 次点击
所在节点    Linux
12 条回复
cyhulk
2018-12-20 10:58:01 +08:00
mysql 可以增加局部变量,select 局部变量做操作就行了
wqzjk393
2018-12-20 10:58:02 +08:00
对第二张表 group by id,然后 sum 一下总的消费金额 生成一个临时表 3。剩余金额就是 select (表 1.总金额-表 3.消费金额) from 表 1 join 表 3。不知道是不是这个意思
CRVV
2018-12-20 11:35:52 +08:00
WITH data AS (
SELECT created_at, id AS card_id, total, total AS amount FROM card
UNION ALL
SELECT transaction.created_at, card_id, card.total, -transaction.total FROM transaction INNER JOIN card ON card_id = card.id)
SELECT created_at, card_id, total, sum(amount) OVER (PARTITION BY card_id ORDER BY created_at) FROM data;

重点是 window function,sum(amount) OVER (PARTITION BY card_id ORDER BY created_at)
zhangolve
2018-12-20 12:41:53 +08:00
@CRVV 我要看看,先谢过。
zhangolve
2018-12-20 13:47:56 +08:00
@CRVV 试过了,可行。再次感谢,之前对 window function 没太多了解。
suiterchik
2018-12-20 13:51:56 +08:00
都上窗函数了为啥不
sum(amount) over(
partition by card_id
order by created_at
rows between unbounded preceding
and current row
)
这个可以计算截至到当前行的支付总额
ziding
2018-12-20 14:02:42 +08:00
这种需求建议在业务层处理,窗口函数用起来爽,等到后面加需求的时候,慢慢慢慢的性能就被脱下来了。
suiterchik
2018-12-20 14:03:40 +08:00
@CRVV 你这个 sql 不约束行号不行吧,OVER (PARTITION BY card_id ORDER BY created_at) 这个窗,card_id 相同的记录返回的值都是一样的
CRVV
2018-12-20 14:58:16 +08:00
@suiterchik
楼主都回帖说能用了,那当然是能用的
你加的那个 ROWS BETWEEN ... 是默认值,加不加都一样
suiterchik
2018-12-20 17:44:34 +08:00
@CRVV 默认的 rows between 是 rows between unbounded preceding and unbounded following,楼主的需求是求当前时间的累积,显然要约束在 current row
zhangolve
2018-12-21 15:43:35 +08:00
@CRVV 我说的能用是,理解了这个意思,经过我自己改造后能用。哈哈。
zhangolve
2018-12-21 16:41:26 +08:00
WITH data AS (
SELECT created_at, id AS card_id, total, total AS remaining_total FROM prepay_card
UNION ALL
SELECT pct.created_at, pct.prepay_card_id AS card_id, pc.total, -pct.total AS remaining_total
FROM prepay_card_transaction pct
INNER JOIN prepay_card pc ON pct.prepay_card_id = pc.id
)
SELECT created_at, card_id, total,sum(remaining_total) OVER (PARTITION BY card_id ORDER BY created_at) AS remaining_total_all FROM data
ORDER BY card_id, created_at ;

补充一下我根据 @CRVV 改写的 sql

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/519245

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX