我有一个关于SQL Server的问题:如何获取前一天的值?
CREATE TABLE [dbo].[productdetails]
(
[productname] [varchar](50) NULL,
[productdate] [date] NULL,
[price] [int] NULL
)
INSERT INTO [dbo].[productdetails] ([productname], [productdate], [price])
VALUES (N'lux', CAST(N'2022-02-22' AS Date), 10)
INSERT INTO [dbo].[productdetails] ([productname], [productdate], [price])
VALUES (N'lux', CAST(N'2022-02-23' AS Date), 20)
INSERT INTO [dbo].[productdetails] ([productname], [productdate], [price])
VALUES (N'lux', CAST(N'2022-02-25' AS Date), 30)
INSERT INTO [dbo].[productdetails] ([productname], [productdate], [price])
VALUES (N'lux', CAST(N'2022-02-26' AS Date), 40)
INSERT INTO [dbo].[productdetails] ([productname], [productdate], [price])
VALUES (N'pen', CAST(N'2022-01-20' AS Date), 30)
INSERT INTO [dbo].[productdetails] ([productname], [productdate], [price])
VALUES (N'pen', CAST(N'2022-01-22' AS Date), 40)
INSERT INTO [dbo].[productdetails] ([productname], [productdate], [price])
VALUES (N'pen', CAST(N'2022-01-23' AS Date), 50)
INSERT INTO [dbo].[productdetails] ([productname], [productdate], [price])
VALUES (N'pen', CAST(N'2022-01-26' AS Date), 60)
基于上述数据,我希望输出如下:
ProductName|ProductDate|价格|previousday价格
-|-|
Lux|2022-02-22|10|空
勒克斯|2022-02-23|20|10
Lux|2022-02-25|30|空
勒克斯|2022-02-26|40|30
PEN|2022-01-20|30|空
PEN|2022-01-22|40|空
笔|2022-01-23|50|40
PEN|2022-01-26|60|空
在这里,当我们将该产品名称lux
和ProductDate=2022-02-25与之前日期2022-02-24进行比较时,我们没有该产品的任何记录。
因此,我们需要在前一天的价格字段中显示值为空。
select
*,
lag(price) over (partition by productname order by productdate ) as previousdayprice
from
[test].[dbo].[productdetails]
order by
productname, productdate
此查询不返回异常结果。您能告诉我如何在SQL Server中编写查询来实现这一任务吗?
2条答案
按热度按时间r6vfmomb1#
你可以用下面的查询达到预期的效果。
55ooxyrt2#
在下面,使用外部应用对所有日期的后代进行排序。
然后,我们按每个产品的最后产品日期进行筛选,每个产品的日期必须大于之前的产品日期。因此,我们得到了所需的结果集。
使用表变量是为了添加它。
结果查询;
结果集;