1

试图找出解决这个问题的最佳方法。为了简单起见,我将编造一些不合理的情况作为例子;我是一个有一些垃圾数据的商人,我不知道人们购买了多少物品,所以我必须回到它

  • 我有三种产品,客户以三种不同的价格购买(250 美元、350 美元、500 美元)
  • 我有客户支付的总金额(与此示例无关的税款/退款等)

因此,如果我知道一位客户支付了 600 美元——他们很可能以 250 美元的价格购买了一件产品,以 350 美元的价格购买了一件产品。如果客户支付了 1000 美元,那么他们要么以 500 美元的价格购买了 2 件产品,要么以 250 美元的价格购买了 4 件产品,或者以 250 美元*2 和 500 美元的价格购买了 3 件产品(谢谢@dennis)。

我想要的是这样的:

客户ID total_amount_paid 假定产品数量 假定价格
1241 1000 4 250, 250, 250, 250
1241 1000 2 500, 500
1241 1000 3 250、250、500
0912 600 2 250, 350

任何建议都会有所帮助。真的坚持试图解决这个问题而不会想太多。

4

1 回答 1

2

很酷的问题...

Snowflake 的好处是我们可以使用蛮力方法……预先计算所有可能的组合,然后使用qualifyrow_number过滤重复项并使用ascii

为了让它更有趣,我包括退货(所以数量可以从 -10 到 10)并添加了第四个产品 @ 135 美元。我确实将不同产品的总数限制为 2 ...但这可以很容易地推到 3。

select 
    cust_total,
    product, 
    second_product,
    quantity,
    second_quantity,
    ascii(product)+ascii(second_product) basket,
    quantity+second_quantity basket_quantity 
from     
    (select
    ap1.product,
    ap2.product second_product,
    ap1.quantity,
    ap2.quantity second_quantity,
    sum(ap1.revenue_combos) + sum(ap2.revenue_combos) cust_total
from
    all_possibles ap1,
    all_possibles ap2
where
    ap1.product<>ap2.product
group by
    1,2,3,4)
group by 
    1,2,3,4,5,6  
qualify
    1=  
    row_number() over 
        (partition by cust_total,basket,basket_quantity 
         order by     product,second_product)

在此处输入图像描述

完整复制|粘贴|在 SQL 中运行:

with all_possibles as (
select
    *
from
    (
        SELECT
            seq4() -10 quantity,
            quantity * prod_price_1 A,
            quantity * prod_price_2 B,
            quantity * prod_price_3 C,
            quantity * prod_price_4 D
        FROM
            TABLE (GENERATOR (ROWCOUNT => 21)),
            (
                select
                   /*UNIFORM (1, 500, random())*/250::int prod_price_1,
                   /*UNIFORM (1, 500, random())*/350::int prod_price_2,
                   /*UNIFORM (1, 500, random())*/500::int prod_price_3,
                   /*UNIFORM (1, 500, random())*/135::int prod_price_4
            )
    ) unpivot (
        revenue_combos for product in (
            A,
            B,
            C,
            D
        )
    )
 )

 select 
cust_total,
product, 
second_product,
quantity,
second_quantity,
ascii(product)+ascii(second_product) basket,
quantity+second_quantity basket_quantity 
 from     
 (select
ap1.product,
ap2.product second_product,
ap1.quantity,
ap2.quantity second_quantity,
sum(ap1.revenue_combos) + sum(ap2.revenue_combos) cust_total
 from
all_possibles ap1,
all_possibles ap2
 where
ap1.product<>ap2.product
 group by
1,2,3,4)
 group by 1,2,3,4,5,6  
 qualify
1=  row_number() over (partition by cust_total,basket,basket_quantity order by product,second_product )
于 2021-07-20T06:46:35.180 回答