【问题标题】:Filter out null values resulting from window function lag() in SQL query在 SQL 查询中过滤掉由窗口函数 lag() 产生的空值
【发布时间】: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 是的,已编辑,谢谢

标签: sql postgresql


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多