在 PostgreSQL 的案例语句中使用聚合和布尔值时遇到问题

Posted

技术标签:

【中文标题】在 PostgreSQL 的案例语句中使用聚合和布尔值时遇到问题【英文标题】:Having trouble using aggregate and boolean in a Case Statement in PostgreSQL 【发布时间】:2016-10-02 11:34:41 【问题描述】:

我在 PostgreSQL 中有一个包含 3 个字段的表:ebtyp、erdat、v_no。

输入:

我要申请:(case when ebtyp='LA' and erdat=max(erdat) then vbeln end) as Inbound_delivery_number

我不想为 LA/AB 过滤或使用 where 子句,因为我不想消除任何行。

输出:

我试过了,但它不起作用:

select case 
        when ebtyp='LA' and erdat=max(erdat) 
             then v_no OVER (PARTITION BY ebtyp) 
      end as Inbound_delivery_number 
from abc.table1;

我们可以在案例语句中使用带有布尔函数的聚合函数吗?有什么解决办法吗?

【问题讨论】:

meta.***.com/questions/285551/… 【参考方案1】:

我认为窗口函数应该提供你想要的功能。如果我理解正确,那么这会产生问题中的结果:

select t1.*,
       max(erdate) over (partition by ebtype) as max_erdat,
       (case when ebtyp = 'LA'
             then max(v_no) over (partition by ebtyp) 
             else v_no
        end) as Inbound_delivery_number 
from abc.table1 t1;

【讨论】:

【参考方案2】:

根据我对您的需求的理解,您没有提供理想的数据来展示您的案例,因此我通过将两个 erdat 更改为更高的来修改它:

 ebtyp |   erdat    | v_no
-------+------------+------
 LA    | 2016-09-09 |    4
 AB    | 2016-10-10 |    4
 LA    | 2016-11-11 |    5
 AB    | 2016-11-15 |    6

查询:

select 
  ebtyp, erdat, v_no, 
  max(case when ebtyp = 'LA' then erdat end) over () as max_erdat, 
  case when ebtyp = 'LA' then max(v_no) over (partition by ebtyp) else v_no end as max_v_no 
from abc.table1;

输出:

 ebtyp |   erdat    | v_no | max_erdat  | max_v_no
-------+------------+------+------------+----------
 AB    | 2016-10-10 |    4 | 2016-11-11 |        4
 AB    | 2016-11-15 |    6 | 2016-11-11 |        6
 LA    | 2016-09-09 |    4 | 2016-11-11 |        5
 LA    | 2016-11-11 |    5 | 2016-11-11 |        5

【讨论】:

以上是关于在 PostgreSQL 的案例语句中使用聚合和布尔值时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

尝试更新包含聚合函数(计数)的选择案例语句时出错

PostgreSQL Json字段作为查询条件案例

更新语句语法 (PostgreSQL-Redshift)

PostgreSQL存储过程-return语句

有没有办法在聚合调用中不使用 ORDER BY 对 postgresql 自定义聚合中的行进行预排序?

PostgreSQL - 必须出现在 GROUP BY 子句中或在聚合函数中使用