如何追踪表内积分变动?每日PointsWon变化量统计方法咨询
嘿,这个需求其实用SQL的窗口函数就能轻松搞定,绝对是最简便的方案!
核心思路:用
LAG()窗口函数计算日环比变化 你的需求本质是计算当日积分与前一日积分的差值,而LAG()函数专门用来获取分组内前一行的数据,完美适配这个场景,比写自连接要简洁太多。
假设你的表名为daily_points,直接用下面的SQL语句就能得到结果:
SELECT Date, PointsWon, -- 用当日积分减去前一日积分,得到变化量 PointsWon - LAG(PointsWon) OVER (ORDER BY Date) AS PointsChange FROM daily_points -- 按日期倒序,方便查看最新数据 ORDER BY Date DESC;
代码解释:
LAG(PointsWon) OVER (ORDER BY Date):这部分会先把数据按日期升序排列,然后为每一行抓取它前一天的PointsWon值。PointsWon - LAG(...):直接做减法,正数代表积分增加,负数代表减少,一目了然。
用你提供的示例数据,运行后会得到这样的结果:
| Date | PointsWon | PointsChange |
|---|---|---|
| 2018-03-20 | 4567 | 54 |
| 2018-03-19 | 4513 | 634 |
| 2018-03-18 | 3879 | NULL |
优化小技巧:
如果想把最早日期的NULL(因为没有前一天数据)改成0,可以用COALESCE()函数处理:
SELECT Date, PointsWon, COALESCE(PointsWon - LAG(PointsWon) OVER (ORDER BY Date), 0) AS PointsChange FROM daily_points ORDER BY Date DESC;
扩展场景:多用户积分追踪
如果你的表还有UserID字段(需要按用户分别统计),只需要在OVER()里加上PARTITION BY UserID,就能按用户分组计算每日变化:
SELECT UserID, Date, PointsWon, PointsWon - LAG(PointsWon) OVER (PARTITION BY UserID ORDER BY Date) AS PointsChange FROM daily_points ORDER BY UserID, Date DESC;
内容的提问来源于stack exchange,提问作者Drishti
相关产品推荐
相关产品推荐

