我想知道如何检查 PostgreSQL 以查看客户是否同时提出了保修索赔和产品销售。
例如,我有一个这样的客户。
CustomerID | OrderID | 产品名称 |
---|---|---|
ABC123 | 1426457 | 产品 A |
ABC123 | 1426458 | 保修声明 |
所以对于这个客户。我想将一列设置为 true 表示他/她同时包含产品销售和保修索赔。
鉴于这样的客户
CustomerID | OrderID | 产品名称 |
---|---|---|
DEF456 | 1426990 | 产品 A |
DEF456 | 1427500 | 产品B |
我想将一列设置为 false,因为他/她没有保修索赔。
客户是否下了两个以上的订单并不重要。只要有保修索赔和产品销售,我就想将其设置为 true。
这可能吗?到目前为止,我已经尝试了各种使用 SQL 的解决方案,但都无济于事。
预期输出:
CustomerID | OrderID | 产品名称 | 布尔 |
---|---|---|---|
ABC123 | 1426457 | 产品 A | TRUE |
ABC123 | 1426458 | 保修声明 | TRUE |
CustomerID | OrderID | 产品名称 | 布尔 |
---|---|---|---|
DEF456 | 1426990 | 产品 A | 假 |
DEF456 | 1427500 | 产品B | 假 |
答案 0 :(得分:1)
SELECT
"CustomerID",
bool_or("Product Name" = 'WARRANTY CLAIM')
AND
bool_or("Product Name" != 'WARRANTY CLAIM')
FROM mytable
GROUP BY "CustomerID"
通过在 bool_or()
上使用 CustomerID
进行聚合并检查 Product Name
是否为 WARRENTY CLAIM
,您将预期结果作为聚合返回。因此,一项检查应该是至少有一个 WARRENT CLAIM
并且至少有一个没有。
如果你想在每条记录上都得到这个,你可以使用 bool_or()
window function:
SELECT
*,
bool_or("Product Name" = 'WARRANTY CLAIM') OVER (PARTITION BY "CustomerID")
AND
bool_or("Product Name" != 'WARRANTY CLAIM') OVER (PARTITION BY "CustomerID")
FROM mytable