SQL Row_number() 重复

Posted

技术标签:

【中文标题】SQL Row_number() 重复【英文标题】:SQL Row_number() Repeat 【发布时间】:2018-02-26 16:04:59 【问题描述】:

我在使用以下代码时遇到了一些问题。我正在研究一个***篮子问题,我试图计算每笔交易应该只有 4 个项目的篮子组合的数量。以下代码运行良好,但当一笔交易购买了额外的 4 件(或更多)商品时,它不会被计入 combine_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 项,其余的则保留(对于每笔交易)。有没有办法在 row_number 函数超过 4 时重复它,或者是否有其他方法可以解决这个问题,以便计算 4 的每个事务?

交易的期望结果是每个项目都标记为 1 到 4。

【问题讨论】:

如果您的订单中有 3 件商品会怎样?您应该从 4 继续还是应该从 1 开始下一笔交易? 除非你有 mysql 8+ 这不是 mysql 代码。 如果项目的数量不是 4 的倍数,这将是一个错误,因此它不应该发生(对于给定的交易)。 【参考方案1】:

您可以添加一个数学函数,即 Row_number % 4。这样即使没有分区也可以解决问题:

row_number() over (order by article_name) % 4 as row_id

虽然,我不能 100% 确定 MySQL 中是否存在 % 作为符号。如果没有,请寻找模块化划分。

【讨论】:

谢谢。我选择了这样的东西:select edw_transaction_id, (row_number() over (partition by edw_transaction_id order by article_name) % 4) +1 as row_id, article_name

以上是关于SQL Row_number() 重复的主要内容,如果未能解决你的问题,请参考以下文章

解析函数:ROW_NUMBER( )

SQL 编号 - Row_Number() - 允许重复行号

SQL Row_number() 重复

SQL+获取具有最新日期的行+row_number()+重复时的情况

MySQL 中用于插入的 ROW_NUMBER() 等效项[重复]

重新启动 T-SQL 中的行号 [重复]