在 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
的行。
是否有专门用于这些情况的子句? WHERE
或 HAVING
不允许聚合或窗口函数案例。
【问题讨论】:
。 .您的查询没有意义。你有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() 产生的空值的主要内容,如果未能解决你的问题,请参考以下文章