PostgreSQL里实现计算多个数字的排列组合

news/2025/2/22 15:02:47

在进行排列组合的时候,每一次需要知道是否有重复的值,并过滤出已经排列过的值。这个可以创建支持可变参数的函数来实现。下边的函数用到了聚合判断,并且可变参数使用variadic标记的数组。

postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:48:02)=# CREATE or replace FUNCTION has_repeat_values(VARIADIC arr int[]) RETURNS boolean AS $$
  select count(distinct val)<>count(*) dist_val from unnest($1) t(val) where val is not null;
$$ language sql strict;
CREATE FUNCTION
postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:48:10)=# select has_repeat_values(1,2,3);
+-------------------+
| has_repeat_values |
+-------------------+
| f                 |
+-------------------+
(1 row)

postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:48:22)=# select has_repeat_values(1,2,3,3);
+-------------------+
| has_repeat_values |
+-------------------+
| t                 |
+-------------------+
(1 row)

postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:56:47)=# select has_repeat_values(1,2,3,null);
+-------------------+
| has_repeat_values |
+-------------------+
| f                 |
+-------------------+
(1 row)

postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:58:20)=# select has_repeat_values(1,2,3,null,null);
+-------------------+
| has_repeat_values |
+-------------------+
| f                 |
+-------------------+
(1 row)

image.png

然后是如何使用这个函数结合查询语句对一组数据进行排列组合。

先创建一个测试的表,里边存放要进行排列组合的数据。

postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:52:26)=# create table test_data(id int);
CREATE TABLE
postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:52:27)=# insert into test_data select generate_series(1,4);
INSERT 0 4
postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:52:40)=# select * from test_data;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
(4 rows)

image.png


例如,一张表里有1234这四个值。想使用四个值做排列组合。
根据4的阶乘可以得到,总共应该有24种,阶乘可以使用factorial函数。

postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:52:46)=# select factorial(4);
+-----------+
| factorial |
+-----------+
|        24 |
+-----------+
(1 row)

image.png


然后下边使用创建的判断是否有重复数据的函数以及使用SQL实现获取所有的排列组合。


postgres<16.1>(ConnAs[postgres]:PID[188277] 2024-02-19/08:56:16)=# select t1.id,t2.id,t3.id  from test_data t1,test_data t2,test_data t3,test_data t4 where not has_repeat_values(t1.id,t2.id,t3.id,t4.id);
+----+----+----+
| id | id | id |
+----+----+----+
|  1 |  2 |  3 |
|  1 |  2 |  4 |
|  1 |  3 |  2 |
|  1 |  3 |  4 |
|  1 |  4 |  2 |
|  1 |  4 |  3 |
|  2 |  1 |  3 |
|  2 |  1 |  4 |
|  2 |  3 |  1 |
|  2 |  3 |  4 |
|  2 |  4 |  1 |
|  2 |  4 |  3 |
|  3 |  1 |  2 |
|  3 |  1 |  4 |
|  3 |  2 |  1 |
|  3 |  2 |  4 |
|  3 |  4 |  1 |
|  3 |  4 |  2 |
|  4 |  1 |  2 |
|  4 |  1 |  3 |
|  4 |  2 |  1 |
|  4 |  2 |  3 |
|  4 |  3 |  1 |
|  4 |  3 |  2 |
+----+----+----+
(24 rows)

image.png


http://www.niftyadmin.cn/n/5381730.html

相关文章

MongoDB语言命令

文章目录 MongoDB shellMongoDB数据类型数据插入数据查询数据删除数据更新MongoDb数组更新和时间序列MongoDB特殊索引mongoDB权限设置 MongoDB shell 1、MongoDB用文档的形式存储数据&#xff0c;BSON的数据格式。 2、MongoDB与传统数据库相比&#xff0c;集合相当于表&#x…

rtt的io设备框架面向对象学习-硬件rtc设备

目录 1.硬件rtc设备基类2.硬件rtc设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 硬件rtc和软件rtc设备是互斥的。因为它们的名字都叫"rtc"&#xff0c;在对象容器中不允许重名。 1.硬件rtc设备基类 此层处于设备驱…

【大模型 知识图谱】ChatKBQA:KBQA知识图谱问答 + 大模型

ChatKBQA&#xff1a;KBQA知识图谱问答 大模型 提出背景传统方法处理流程ChatKBQA处理流程对比优势 总结ChatKBQA框架概览特征1&#xff1a;逻辑形式生成特征2&#xff1a;无监督实体和关系检索特征3&#xff1a;参数高效的微调特征4&#xff1a;GQoT 可解释的查询执行特征5&a…

16-树-路径总和 II

这是树的第16篇算法&#xff0c;力扣链接。 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,…

设计模式三大原则

单一原则 类的职责要单一&#xff0c;一个类完成一项功能 类本身就是一组属性和行为的集合。是一组&#xff0c;不是多组 开闭原则&#xff08;单一原则的扩展&#xff09; 对外扩展开放&#xff0c;对内修改关闭 即为&#xff1a; 1. 尽量不修改已经实现或者定义好的类&…

区块链技术和Hyperledger Fabric介绍

1 区块链介绍 1.1 区块链技术形成 1.1.1 起源 在比特币诞生之时&#xff0c;技术专家们开始研究比特币的底层技术&#xff0c;并抽象提取出来&#xff0c;形成区块链技术&#xff0c;或者称分布式账本技术。 1.1.2 定义 简称BT&#xff08;Blockchain technology&#xff…

【洛谷题解】B2052 简单计算器

题目链接&#xff1a;简单计算器 - 洛谷 题目难度&#xff1a;入门 涉及知识点&#xff1a;计算 题意&#xff1a; 分析&#xff1a;直接判断输出即可 AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int a,b;char c;ios::sync_with_…

找座位 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。 现在给出一排观众座位分布图,座位中存在已落座的观众,请计算出,在不移动现有观众座位…