求SQL Server查询语句:基于同日上一开奖号计算往期销售额
SQL Server 查询:基于同一天上一个开奖号码计算往期销售额
假设你的开奖数据表名为 lottery_data,包含以下核心字段:
draw_date:开奖日期(DATE 类型)draw_number:开奖号码(INT 类型,同一日期内按开奖顺序递增)sales:当期销售额(DECIMAL 或 MONEY 类型)
可以使用 SQL Server 的 LAG() 窗口函数直接实现需求,该函数能在同一分组内获取当前行的前一行数据:
SELECT draw_date, draw_number, sales, -- 获取同一天上一个开奖号码的销售额,无前置记录则返回 NULL LAG(sales) OVER (PARTITION BY draw_date ORDER BY draw_number) AS previous_sales FROM lottery_data ORDER BY draw_date, draw_number;
如果需要把当天第一个开奖号码的往期销售额默认设为 0(避免 NULL),可以用 ISNULL() 处理:
SELECT draw_date, draw_number, sales, ISNULL(LAG(sales) OVER (PARTITION BY draw_date ORDER BY draw_number), 0) AS previous_sales FROM lottery_data ORDER BY draw_date, draw_number;
关键逻辑说明
PARTITION BY draw_date:将数据按开奖日期分组,确保只在同一天的开奖记录中查找上一条数据ORDER BY draw_number:在每个日期分组内按开奖号码排序,保证取到的是当前开奖的上一个顺序的销售额LAG(sales):默认返回当前行的前一行sales值,若当前行是分组内第一行,则返回 NULL
示例效果
假设原始数据:
| draw_date | draw_number | sales |
|---|---|---|
| 2024-05-01 | 1 | 10000 |
| 2024-05-01 | 2 | 15000 |
| 2024-05-01 | 3 | 20000 |
| 2024-05-02 | 1 | 12000 |
| 2024-05-02 | 2 | 18000 |
执行第二个查询后的输出:
| draw_date | draw_number | sales | previous_sales |
|---|---|---|---|
| 2024-05-01 | 1 | 10000 | 0 |
| 2024-05-01 | 2 | 15000 | 10000 |
| 2024-05-01 | 3 | 20000 | 15000 |
| 2024-05-02 | 1 | 12000 | 0 |
| 2024-05-02 | 2 | 18000 | 12000 |
内容的提问来源于stack exchange,提问作者Pravesh Loto
相关产品推荐
相关产品推荐

