SQL实现排列组合功能

本文介绍了如何使用SQL实现排列组合功能,通过不同类型的JOIN操作和关联条件,分别展示了如何实现从有序数据中选取人员的组合和排列。讨论了组合中去重的方法以及排列的保留策略,并给出了具体实现SQL的示例。
摘要由CSDN通过智能技术生成

SQL实现排列组合功能

昨天朋友发给我一个sql编程题目:
在这里插入图片描述
大概意思就是随机选择几个人使得总分最接近某个值,这不正是数学中学习过的排列组合中的组合吗?
排列组合中A(15,3)表示排列,从15个中有序抽取3个,所以一共有15*14*13种排列结果,123、132、213、231、312、321表示6种不同的结果
排列组合中C(15,3)表示组合,从15个中无序选择3个,所以一共有(15*14*13)/(3*2*1)种组合结果,123、132、213、231、312、321表示同一种结果

大概思路:如果使用编程语言,比如java、c编写时,可以使用嵌套循环或者递归实现,通过控制循环进行遍历,将三个人的成绩累加后保存在数组中;但是如果使用sql实现循环或者递归的话,对于大部分人(包括我)来说是比较难理解的,也是比较难实现的,所以我们只能使用 join 来实现。
但是怎样关联是需要我们思考的,left join?right join?还是inner join?关联条件又是什么?

1.我们看一下表中的数据,姓名列是有序排列的

如果我们进行C(15,2)操作时,可以进行如下关联:

select * from
tmp_lhj a1 --tmp_lhj为以上excel数据在库中临时表的表名
left join
tmp_lhj a2 on a可以进行1.name<a2.name
where a2.name is not null

如果我们进行A(15,2)操作时,可以进行如下关联:

select * from
tmp_lhj a1 --tmp_lhj为以上excel数据在库中临时表的表名
left join
tmp_lhj a2 on a1.name != a2.name
where a2.name is not null

排列和组合的区别在于是否有序:
【1】如果进行组合,则顺序12和顺序21是重复的,应该去掉一条,所以关联条件使用<正好可以将21这一条去掉;(顺序12指的是第一次选择A01,第二次选择A02)
【2】如果进行排列,顺序12和顺序21是两种结果,使用!=关联可以将两条结果均保留。
【3】如果第一个人选择A15,则后面不能选择比它排序更高的人了,所以第二个人为空,这样的话这一条数据就没有意义,因此加一个限制条件a2.name is not null

2.上面是选取两个人,依次类推,当我们取3个人

进行C(15,3)操作时,可以进行如下关联:

select * from
tmp_lhj a1 --tmp_lhj为以上excel数据在库中临时表的表名
left join
tmp_lhj a2 on a1.name<a2.name
left join
tmp_lhj a3 on a2.name<a3.name
where a3.name is not null

进行A(15,3)操作时,可以进行如下关联:

select * from
tmp_lhj a1 --tmp_lhj为以上excel数据在库中临时表的表名
left join
tmp_lhj a2 on a1.name!=a2.name
left join
tmp_lhj a3 on a2.name!=a3.name
where a3
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Operose-honeybee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值