当一个需求让我们从一个集合中抽取两个数据,这个过程怎么办?如果是写代码这个需求很容易实现但当让我们写sql时怎么办呢?
主要的思路是将这一个表让他跟自身进行join,
这是张三最近的几张路线订单,从他的五条线路中随机抽取两条,求任意两个线路出现的次数
张三 line1
张三 line2
张三 line3
张三 line4
张三 line5
相当于是N取2问题,写代码容易实现但是在sql中怎么实现呢?
join
用这张表跟自身进行joinjoin条件为 name相同,但是会出现一种问题,同样的两条路线只是前后顺序不同会算两次
怎么办呢?
给他们再加一列限定条件即可,
and A.rank>B.rank
张三 line1 张三 line4
张三 line2 张三 line4
张三 line3 张三 line4
张三 line4 张三 line4
张三 line5 张三 line5
rank rank
1 张三 line1 1 张三 line4
2 张三 line2 2 张三 line4
3 张三 line3 3 张三 line4
4 张三 line4 4 张三 line4
5 张三 line5 5 张三 line5
table_A join table_B
on A.name=B.name where A.line!=B.line and A.rank>B.rank
加rank的方法可以使用窗口函数
row_number() over(partition by name)即可
网友评论