select
    dp.profit_id,
    dp.profit_date,
    dp.profit,
    sum(dp.profit) over (order by dp.profit_date)as cumulative_profit
from
    daily_profits dp
order by
    dp.profit_date;
  1. select 部分:dp.profit_id:选择 “daily_profits” 表中的 “profit_id” 列,这一列可能是用于标识利润记录的唯一标识符。dp.profit_date:选择 “daily_profits” 表中的 “profit_date” 列,代表利润数据对应的日期。dp.profit:选择 “daily_profits” 表中的 “profit” 列,即每日的利润数值。sum(dp.profit) over (order by dp.profit_date) as cumulative_profit:使用窗口函数计算累计利润。sum(dp.profit) 是对 “profit” 列进行求和,over (order by dp.profit_date) 表示按照 “profit_date” 列的顺序进行计算,as cumulative_profit 是给这个计算结果取别名为 “cumulative_profit”,也就是累计利润。
  2. from 部分:from daily_profits dp 表示数据来源于 “daily_profits” 表,并给该表取别名为 “dp”,方便后续引用。
  3. order by 部分:order by dp.profit_date 表示最终查询结果按照 “profit_date” 列进行排序,即按日期顺序展示数据。
SELECT 
    a.profit_id,
    a.profit_date,
    a.profit,
    SUM(b.profit) AS cumulative_profit
FROM 
    daily_profits a
-- 自连接,关联日期小于等于当前行的记录
JOIN 
    daily_profits b ON a.profit_date >= b.profit_date
GROUP BY 
    a.profit_id, a.profit_date, a.profit
ORDER BY 
    a.profit_date;
  1. SELECT a.profit_id, a.profit_date, a.profit, SUM(b.profit) AS cumulative_profit:选择要返回的列。a.profit_ida.profit_datea.profit分别是从表a(即daily_profits)中选择的利润 ID、利润日期和当日利润。SUM(b.profit) AS cumulative_profit计算从开始日期到当前日期的累计利润,并将其命名为cumulative_profit
  2. FROM daily_profits a:指定数据源表为daily_profits,并给它一个别名a
  3. JOIN daily_profits b ON a.profit_date >= b.profit_date:这是一个自连接操作,将表a与自身连接(别名为b),连接条件是a表中的日期大于等于b表中的日期。这样可以获取到当前日期及之前所有日期的利润数据,用于计算累计利润。
  4. GROUP BY a.profit_id, a.profit_date, a.profit:按profit_idprofit_dateprofit进行分组,确保每个日期的利润和累计利润都能正确计算。
  5. ORDER BY a.profit_date:按profit_date对结果进行排序,以日期顺序展示数据。