SQL Server 2019中无需CTE/子查询获取上季度销售信息
解决方案:无需CTE/子查询实现需求
假设你的MonthlySales表包含SaleDate(销售日期)、SalePrice(销售价格)等核心字段,在SQL Server 2019中可以直接通过单条SELECT语句完成需求,无需CTE或子查询:
SELECT SaleDate, SalePrice, -- 同季度的上一笔销售价格 LAG(SalePrice) OVER ( PARTITION BY DATEPART(QUARTER, SaleDate) ORDER BY SaleDate ) AS SameQuarterPreviousPrice, -- 所属季度的上一个季度 CASE WHEN DATEPART(QUARTER, SaleDate) = 1 THEN 4 ELSE DATEPART(QUARTER, SaleDate) - 1 END AS PreviousQuarter FROM MonthlySales WHERE YEAR(SaleDate) = 2007;
关键说明:
同季度上一笔价格:
使用LAG函数时,通过PARTITION BY DATEPART(QUARTER, SaleDate)将数据按季度分区,确保只在当前季度内查找上一条记录;ORDER BY SaleDate保证按销售时间顺序取前一条——这应该是你之前直接用LAG未得到预期结果的核心原因:缺少按季度的分区逻辑。上一个季度计算:
通过CASE处理Q1的特殊情况(Q1的上一个季度对应上一年的Q4,季度数为4),其他季度直接减1即可。如果需要带上年份(比如2007Q1的上一个季度显示为2006Q4),可以调整为:CONCAT( YEAR(SaleDate) - CASE WHEN DATEPART(QUARTER, SaleDate) = 1 THEN 1 ELSE 0 END, 'Q', CASE WHEN DATEPART(QUARTER, SaleDate) = 1 THEN 4 ELSE DATEPART(QUARTER, SaleDate) - 1 END ) AS PreviousQuarterWithYear
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

