我有一个看起来有点像这样的表:
Customer_ID | Offer_1 | Offer_2 | Offer_3
------------|---------|---------|--------
111 | A01 | 001 | B01
222 | A01 | B01 | 001
333 | A02 | 001 | B01
我想编写一个查询来计算表中有多少独特的报价组合,无论报价以什么顺序出现。
因此,在上面的示例中,有两个独特的组合:客户 111 和 222 都有相同的三个优惠,因此它们被视为一个独特的组合,然后客户 333 是唯一拥有三个订单的客户。所以查询的期望输出是 2。
对于一些额外的上下文:
- customer_ID 列是整数格式,所有的offer 列采用 varchar 格式。
- 实际有12个offer列,超过300万行 表,在报价列中有 100 多个不同的值。我 简化了示例以更好地说明我正在尝试做的事情,但是任何解决方案都需要扩展到这个数量 可能的组合。
我可以将所有优惠列连接在一起,然后对结果运行 count distinct 语句,但这不考虑具有相同独特优惠组合但订购方式不同的客户(例如客户 111 和 222 中的上面的例子)。
请问有人知道如何解决这个问题吗?
最佳答案
假设字符 /
没有出现在任何优惠名称中,您可以这样做:
select count(distinct offer_combo) as distinct_offers
from (
select listagg(offer, '/') within group (order by offer) as offer_combo
from (
select customer_id, offer_1 as offer from t
union all select customer_id, offer_2 from t
union all select customer_id, offer_3 from t
) x
group by customer_id
) y
结果:
DISTINCT_OFFERS
---------------
2
查看 db<>fiddle 的运行示例。
关于sql - 无论顺序如何,计算多列中值的唯一组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70988906/