SQL Row_number() 重复
SQL Row_number() Repeat
我在处理以下代码时遇到了一些问题。我正在处理一个顶级购物篮问题,我正在尝试计算每笔交易应该只有 4 件商品的购物篮组合的数量。下面的代码运行良好,但是当一笔交易额外购买了 4 件商品(或更多)时,它不会被计入 combined_basket 步骤。
With RowNums as (
select
edw_transaction_id, row_number() over (partition by edw_transaction_id order by article_name) as row_id, article_name
from thing1
),
BasketItems as (
select a.edw_transaction_id, a.article_name as _1, b.article_name as_2,c.article_name as _3,d.article_name as _4
from (select edw_transaction_id,article_name from RowNums where row_id =1) a
join (select edw_transaction_id,article_name from RowNums where row_id =2) b
on a.edw_transaction_id = b.edw_transaction_id
join (select edw_transaction_id,article_name from RowNums where row_id =3) c
on a.edw_transaction_id = c.edw_transaction_id
join (select edw_transaction_id,article_name from RowNums where row_id =4) d
on a.edw_transaction_id = d.edw_transaction_id
),
combined_basket as (
select count(*) as basket_count, _1 as basket_item1,_2 as basket_item2,_3 as basket_item3,_4 as basket_item4
from BasketItems
group by 2,3,4,5
order by 1 desc
)
select *
from combined_basket
order by 1 desc
limit 10
BasketItems 的输出看起来像这样:
Trans Id Row_num Article_Name
6368773827 1 Apples
6368773827 2 Oranges
6368773827 3 Cheese
6368773827 4 Egg
6368774403 1 Apple
6368774403 2 Egg
6368774403 3 Cake
6368774403 4 Salad
6368774403 5 Egg
6368774403 6 Apple
6368774403 7 Lemon
6368774403 8 Burger
从上面的代码可以看出,它只会计算前 4 项,其余的(对于每笔交易)。有没有一种方法可以在超过 4 时重复 row_number 函数,或者是否有其他方法可以解决这个问题,以便计算每笔 4 的交易?
交易的期望结果是每件商品都标记为 1 到 4。
你可以添加一个数学函数,即Row_number % 4。即使没有分区也能解决问题:
row_number() over (order by article_name) % 4 as row_id
不过,我不是 100% 确定 % 作为符号是否存在于 MySQL 中。如果没有,就找模块化划分。
我在处理以下代码时遇到了一些问题。我正在处理一个顶级购物篮问题,我正在尝试计算每笔交易应该只有 4 件商品的购物篮组合的数量。下面的代码运行良好,但是当一笔交易额外购买了 4 件商品(或更多)时,它不会被计入 combined_basket 步骤。
With RowNums as (
select
edw_transaction_id, row_number() over (partition by edw_transaction_id order by article_name) as row_id, article_name
from thing1
),
BasketItems as (
select a.edw_transaction_id, a.article_name as _1, b.article_name as_2,c.article_name as _3,d.article_name as _4
from (select edw_transaction_id,article_name from RowNums where row_id =1) a
join (select edw_transaction_id,article_name from RowNums where row_id =2) b
on a.edw_transaction_id = b.edw_transaction_id
join (select edw_transaction_id,article_name from RowNums where row_id =3) c
on a.edw_transaction_id = c.edw_transaction_id
join (select edw_transaction_id,article_name from RowNums where row_id =4) d
on a.edw_transaction_id = d.edw_transaction_id
),
combined_basket as (
select count(*) as basket_count, _1 as basket_item1,_2 as basket_item2,_3 as basket_item3,_4 as basket_item4
from BasketItems
group by 2,3,4,5
order by 1 desc
)
select *
from combined_basket
order by 1 desc
limit 10
BasketItems 的输出看起来像这样:
Trans Id Row_num Article_Name
6368773827 1 Apples
6368773827 2 Oranges
6368773827 3 Cheese
6368773827 4 Egg
6368774403 1 Apple
6368774403 2 Egg
6368774403 3 Cake
6368774403 4 Salad
6368774403 5 Egg
6368774403 6 Apple
6368774403 7 Lemon
6368774403 8 Burger
从上面的代码可以看出,它只会计算前 4 项,其余的(对于每笔交易)。有没有一种方法可以在超过 4 时重复 row_number 函数,或者是否有其他方法可以解决这个问题,以便计算每笔 4 的交易?
交易的期望结果是每件商品都标记为 1 到 4。
你可以添加一个数学函数,即Row_number % 4。即使没有分区也能解决问题:
row_number() over (order by article_name) % 4 as row_id
不过,我不是 100% 确定 % 作为符号是否存在于 MySQL 中。如果没有,就找模块化划分。