如何计算SQL中一个数字进入另一个数字的次数?
How to calculate how many times a number goes into another number in SQL?
正在尝试找出解决此问题的最佳方法。为了简单起见,我将编一些不合理的情况来举例;我是一个有一些垃圾数据的商家,我不知道人们购买的商品数量,所以我不得不重新进入它
- 我有三种产品,以及客户购买的三种不同价格($250、$350、$500)
- 我有客户支付的总金额(税款/退款等与此示例无关)
因此,如果我知道客户支付了 600 美元 - 很可能他们以 250 美元的价格购买了一件产品,而以 350 美元的价格购买了另一件产品。如果客户支付了 1,000 美元,那么他们要么以 500 美元的价格购买了 2 件产品,要么以 250 美元的价格购买了 4 件产品,或者以 250 美元*2 和 500 美元的价格购买了 3 件产品(谢谢@dennis)。
我想要的是这样的:
customer_id
total_amount_paid
assumed_number_of_products
assumed_prices
1241
1000
4
250、250、250、250
1241
1000
2
500, 500
1241
1000
3
250、250、500
0912
600
2
250, 350
任何建议都会有所帮助。真的坚持尝试在不考虑太多的情况下解决这个问题。
很酷的问题...
Snowflake 的好处是我们可以使用蛮力方法...预先计算所有可能的组合,然后使用 qualify and row_number with use of ascii.
过滤重复项
为了让它更有趣,我添加了 returns(因此数量可以从 -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 )
正在尝试找出解决此问题的最佳方法。为了简单起见,我将编一些不合理的情况来举例;我是一个有一些垃圾数据的商家,我不知道人们购买的商品数量,所以我不得不重新进入它
- 我有三种产品,以及客户购买的三种不同价格($250、$350、$500)
- 我有客户支付的总金额(税款/退款等与此示例无关)
因此,如果我知道客户支付了 600 美元 - 很可能他们以 250 美元的价格购买了一件产品,而以 350 美元的价格购买了另一件产品。如果客户支付了 1,000 美元,那么他们要么以 500 美元的价格购买了 2 件产品,要么以 250 美元的价格购买了 4 件产品,或者以 250 美元*2 和 500 美元的价格购买了 3 件产品(谢谢@dennis)。
我想要的是这样的:
customer_id | total_amount_paid | assumed_number_of_products | assumed_prices |
---|---|---|---|
1241 | 1000 | 4 | 250、250、250、250 |
1241 | 1000 | 2 | 500, 500 |
1241 | 1000 | 3 | 250、250、500 |
0912 | 600 | 2 | 250, 350 |
任何建议都会有所帮助。真的坚持尝试在不考虑太多的情况下解决这个问题。
很酷的问题...
Snowflake 的好处是我们可以使用蛮力方法...预先计算所有可能的组合,然后使用 qualify and row_number with use of ascii.
过滤重复项为了让它更有趣,我添加了 returns(因此数量可以从 -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 )