SQL实现排列组合功能

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
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
SQL 中,可以使用自连接(self-join)和交叉连接(cross-join)等技术来实现排列组合。以下是一些示例: 1. 排列 排列是指从给定的 n 个元素中,取出 m 个元素进行排列,有序排列,且每个元素只能使用一次。排列的总数为n!/(n-m)!。 假设有一个名为`items`的表,其中包含一列`name`,表示要进行排列的元素。如果要从`items`中选择3个元素进行排列,可以使用以下查询: ``` SELECT a.name, b.name, c.name FROM items a, items b, items c WHERE a.name <> b.name AND a.name <> c.name AND b.name <> c.name; ``` 在这个查询中,我们对`items`表进行了三次自连接,每个连接使用不同的别名(a、b、c)。然后使用`WHERE`子句来过滤掉重复的元素,以确保每个元素只使用一次。 2. 组合 组合是指从给定的 n 个元素中,取出 m 个元素进行组合,无序组合,且每个元素只能使用一次。组合的总数为n!/m!(n-m)!。 假设有一个名为`items`的表,其中包含一列`name`,表示要进行组合的元素。如果要从`items`中选择3个元素进行组合,可以使用以下查询: ``` SELECT a.name, b.name, c.name FROM items a, items b, items c WHERE a.name < b.name AND b.name < c.name; ``` 在这个查询中,我们对`items`表进行了三次自连接,每个连接使用不同的别名(a、b、c)。然后使用`WHERE`子句来过滤掉重复的元素,以确保每个元素只使用一次并且结果是无序的。 需要注意的是,在实际应用中,排列和组合通常需要考虑更多的因素,例如元素可能是重复的,或者需要保证结果是有序的。这些因素将影响查询的编写方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Operose-honeybee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值