如何从Sales_Date列获取对应上一年的Sales数据?
获取每条记录的上一年同期销售额
我有一张包含Sales_Date和Sales列的数据表,Sales_Date列的数据起始年份为2015年。需要获取每条记录对应的上一年同期Sales数据。
示例数据表
| Sales_Date | Sales |
|---|---|
| 1/1/2016 | $25 |
| 1/8/2016 | $57 |
| 1/1/2015 | $125 |
| 1/8/2015 | $21 |
期望结果集
| Sales_Date | Sales | LYear_Sales_Date | LYear_Sales |
|---|---|---|---|
| 1/1/2016 | $25 | 1/1/2015 | $125 |
| 1/8/2016 | $57 | 1/8/2015 | $21 |
解决方案(SQL实现)
可以通过自连接的方式,将表与自身关联,匹配当前记录日期减一年后的同期数据:
通用SQL版本(支持DATEADD函数的数据库,如SQL Server)
SELECT curr.Sales_Date, curr.Sales, prev.Sales_Date AS LYear_Sales_Date, prev.Sales AS LYear_Sales FROM your_table_name curr LEFT JOIN your_table_name prev ON DATEADD(year, -1, curr.Sales_Date) = prev.Sales_Date WHERE prev.Sales_Date IS NOT NULL; -- 过滤无对应上一年数据的记录
MySQL版本
SELECT curr.Sales_Date, curr.Sales, prev.Sales_Date AS LYear_Sales_Date, prev.Sales AS LYear_Sales FROM your_table_name curr LEFT JOIN your_table_name prev ON DATE_SUB(curr.Sales_Date, INTERVAL 1 YEAR) = prev.Sales_Date WHERE prev.Sales_Date IS NOT NULL;
PostgreSQL版本
SELECT curr.Sales_Date, curr.Sales, prev.Sales_Date AS LYear_Sales_Date, prev.Sales AS LYear_Sales FROM your_table_name curr LEFT JOIN your_table_name prev ON curr.Sales_Date - INTERVAL '1 year' = prev.Sales_Date WHERE prev.Sales_Date IS NOT NULL;
说明
- 自连接通过日期偏移精准匹配上一年同期的记录,确保日期完全对应(如1/1/2016对应1/1/2015)
WHERE子句会过滤掉无对应上一年数据的记录(比如2015年的记录,因数据起始于2015年,无2014年数据,故不显示)
内容的提问来源于stack exchange,提问作者Kiruthiga
相关产品推荐
相关产品推荐

