在 SQL 查询中过滤掉由窗口函数 lag() 产生的空值

Posted

技术标签:

【中文标题】在 SQL 查询中过滤掉由窗口函数 lag() 产生的空值【英文标题】:Filter out null values resulting from window function lag() in SQL query 【发布时间】:2020-01-28 11:25:36 【问题描述】:

查询示例:

SELECT *, 
       lag(sum(sales), 1) OVER(PARTITION BY department
       ORDER BY date ASC) AS end_date_sales
FROM revenue
GROUP BY department, date;

我只想显示end_date 不是NULL 的行。

是否有专门用于这些情况的子句? WHEREHAVING 不允许聚合或窗口函数案例。

【问题讨论】:

。 .您的查询没有意义。你有sum(),没有group by。您正在汇总销售额并称之为end_date @GordonLinoff 是的,已编辑,谢谢 【参考方案1】:

一种方法使用子查询:

SELECT r.*
FROM (SELECT r. *, 
             LAG(sum(sales), 1) OVER (ORDER BY date ASC) AS end_date
      FROM revenue r
     ) r
WHERE end_date IS NOT NULL;

也就是说,我认为您编写的查询不正确。我会假设你想要这样的东西:

SELECT r.*
FROM (SELECT r. *, 
             LEAD(end_date, 1) OVER (PARTITION BY ? ORDER BY date ASC) AS end_date
      FROM revenue r
     ) r
WHERE end_date IS NOT NULL;

? 是一个列,例如客户 ID。

【讨论】:

除了将结果包装在子查询中之外,还有其他方法吗? 您可以查看以下答案,该答案无需子查询即可使用。 @Snow 。 . .我建议您提出一个新的 问题,其中包含示例数据、期望的结果和合理的查询。【参考方案2】:

试试这个

select * from (select distinct *,SUM(sales) OVER (PARTITION BY dept) from test)t 
where t.date in(select max(date) from test group by dept)
order by date,dept;

还有一种更简单的方法,无需子查询

SELECT distinct dept,MAX(date) OVER (PARTITION BY dept),
SUM(sales) OVER (PARTITION BY dept) 
FROM test;

【讨论】:

以上是关于在 SQL 查询中过滤掉由窗口函数 lag() 产生的空值的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询获取同一字段前/后n行的值_lag/lead

Hive分析函数LAG和LEAD详解

如何为不同的观察组使用 LAG 和 LEAD 窗口函数

窗口函数 LAG 可以引用正在计算哪个值的列吗?

为啥 T-SQL 中的 LAG 函数是不确定的?

带有 where 子句的窗口函数(LEAD/LAG)?