PostgreSQL-如何在另一个列上创建带有过滤器的条件列?

时间:2019-10-29 11:11:17

标签: postgresql

我想再增加1列,以细分客户是否已售出至少一种产品。 数据示例:

ProductID    Customer     Status
1            John         Not sold
2            John         Not Sold
3            John         Sold

我的预期结果

ProductID    Customer     Status         Sold_at_least_1
1            John         Not sold       Yes
2            John         Not Sold       Yes
3            John         Sold           Yes
4            Andrew       Not Sold       No
5            Andrew       Not Sold       No
6            Brandon      Sold           Yes       

这是示例数据。很抱歉给您带来不便,因为我无法提取数据。顺便说一句,感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您可以对在status = 'Sold'表达式中具有case的同一客户的记录进行窗口计数:

select 
    t.*, 
    case when sum( (status = 'Sold')::int ) over(partition by customer) >= 1
        then 'Yes'
        else 'No'
    end
from mytable

注意:请注意,这不会神奇地创建新记录(如示例数据中所示)。此查询为您提供的结果集中的记录与表中的记录一样多,并且具有一列附加栏,用于指示表中是否每个顾客都至少有一个已售商品。

这里是a demo provided by VBokšić(谢谢)。

答案 1 :(得分:3)

另一种选择是将bool_or()用作窗口函数。如果您可以使用boolean列而不是使用Yes / No的varchar,那么表达式将变得更加简单:

select productid, customer, status, 
       bool_or(status = 'Sold') over (partition by customer) as sold_at_least_one
from mytable;

在线示例:https://rextester.com/NDN54253