如何仅对当前日期应用 SQL LAG 函数?

How to apply SQL LAG function only for current date?

我正在使用 Azure SQL。

我想生成一个包含 30 列的查找报告,以检查某个列在这段时间的演变,但仅限当天而不是所有列。每列代表过去 1、2、3、... 30 天的价格。

如果我在当前日期应用 where 子句,滞后函数将不会回顾任何日子。

这是目前的样子:

它应该是这样的:

我试过的查询:

select 
value, date,
    LAG(value,1) OVER ( partition by name, adress ORDER by date)AS day_1,
    LAG(value,2) OVER ( partition by name, adress ORDER by date)AS day_2,
    LAG(value,3) OVER ( partition by name, adress ORDER by date)AS day_3,
    LAG(value,4) OVER ( partition by name, adress ORDER by date)AS day_4,
    LAG(value,5) OVER ( partition by name, adress ORDER by date)AS day_5,
    LAG(value,6) OVER ( partition by name, adress ORDER by date)AS day_6
   from
products where date = cast(GETDATE() as Date)

试试这个:

WITH CTE1 AS
(
select 
value, date,
    LAG(value,1) OVER ( partition by name, adress ORDER by date)AS day_1,
    LAG(value,2) OVER ( partition by name, adress ORDER by date)AS day_2,
    LAG(value,3) OVER ( partition by name, adress ORDER by date)AS day_3,
    LAG(value,4) OVER ( partition by name, adress ORDER by date)AS day_4,
    LAG(value,5) OVER ( partition by name, adress ORDER by date)AS day_5,
    LAG(value,6) OVER ( partition by name, adress ORDER by date)AS day_6
   from products
)
SELECT * 
FROM CTE1
WHERE date = cast(GETDATE() as Date);

您面临的问题是因为一旦您将 WHERE 子句用于当前日期过滤器,数据就会被过滤,然后 LAG 函数将应用于仅具有当前日期的行(因为其他日期数据已经被过滤掉了)。

所以解决方案是先应用LAG函数,然后对上一个查询得到的结果应用WHERE子句。