Skip to content

Commit d31bd6f

Browse files
committed
collate
1 parent 516f7dd commit d31bd6f

17 files changed

+1214
-1
lines changed

201603/20160322_01.md

Lines changed: 399 additions & 0 deletions
Large diffs are not rendered by default.

201603/readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
##### 20160308_01.md [《让Greenplum 支持反转索引》](20160308_01.md)
66
##### 20160316_01.md [《PostgreSQL 加载动态库详解》](20160316_01.md)
77
##### 20160320_01.md [《PostgreSQL 如何潇洒的处理每天上百TB的数据增量》](20160320_01.md)
8+
##### 20160322_01.md [《PostgreSQL 字符串 collate 与排序 源码分析》](20160322_01.md)

201604/20160402_01.md

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
## PostgreSQL n阶乘计算, 排列组合计算 - 如何计算可变参数中有没有重复参数
2+
3+
### 作者
4+
digoal
5+
6+
### 日期
7+
2016-04-02
8+
9+
### 标签
10+
PostgreSQL , n阶乘 , 排列组合
11+
12+
----
13+
14+
## 背景
15+
PostgreSQL 如何计算可变参数中有没有重复参数,或者说如何计算多列的排列组合。
16+
17+
计算排列组合时,需要知道参数中是否有重复值。目的是过滤掉重复值。
18+
19+
实现方法很简单,需要创建支持可变参数的函数。
20+
21+
## 正文
22+
23+
```
24+
postgres=# CREATE or replace FUNCTION has_dupli_val(VARIADIC arr int[]) RETURNS boolean AS $$
25+
select count(distinct val)<>count(*) dist_val from unnest($1) t(val) where val is not null;
26+
$$ language sql strict;
27+
CREATE FUNCTION
28+
29+
postgres=# select has_dupli_val(1,2,null,1);
30+
has_dupli_val
31+
---------------
32+
t
33+
(1 row)
34+
35+
postgres=# select has_dupli_val(1,2,null,3);
36+
has_dupli_val
37+
---------------
38+
f
39+
(1 row)
40+
41+
postgres=# select has_dupli_val(1,2,null,null);
42+
has_dupli_val
43+
---------------
44+
f
45+
(1 row)
46+
47+
postgres=# select has_dupli_val(null,null);
48+
has_dupli_val
49+
---------------
50+
f
51+
(1 row)
52+
```
53+
54+
还蛮简单的,用到了聚合判断,可变参数使用variadic 标记的数组来定义。
55+
56+
这个函数可以用来生成排列组合。
57+
58+
例子:
59+
60+
```
61+
postgres=# create table t(id int);
62+
CREATE TABLE
63+
postgres=# insert into t select generate_series(1,5);;
64+
INSERT 0 5
65+
```
66+
67+
对1,2,3,4,5这5个值进行排列组合,得出组合结果。
68+
69+
排列组合的可能性有5的阶乘种。即120。
70+
71+
```
72+
postgres=# select 5!;
73+
?column?
74+
----------
75+
120
76+
(1 row)
77+
```
78+
79+
得到1,2,3,4,5的排列组合的方法:
80+
81+
```
82+
postgres=# select t1.id,t2.id,t3.id,t4.id,t5.id from t t1,t t2,t t3,t t4,t t5 where not has_dupli_val(t1.id,t2.id,t3.id,t4.id,t5.id);
83+
id | id | id | id | id
84+
----+----+----+----+----
85+
1 | 2 | 3 | 4 | 5
86+
1 | 2 | 3 | 5 | 4
87+
1 | 2 | 4 | 3 | 5
88+
1 | 2 | 4 | 5 | 3
89+
1 | 2 | 5 | 3 | 4
90+
1 | 2 | 5 | 4 | 3
91+
1 | 3 | 2 | 4 | 5
92+
1 | 3 | 2 | 5 | 4
93+
1 | 3 | 4 | 2 | 5
94+
1 | 3 | 4 | 5 | 2
95+
1 | 3 | 5 | 2 | 4
96+
1 | 3 | 5 | 4 | 2
97+
1 | 4 | 2 | 3 | 5
98+
1 | 4 | 2 | 5 | 3
99+
1 | 4 | 3 | 2 | 5
100+
1 | 4 | 3 | 5 | 2
101+
1 | 4 | 5 | 2 | 3
102+
1 | 4 | 5 | 3 | 2
103+
1 | 5 | 2 | 3 | 4
104+
1 | 5 | 2 | 4 | 3
105+
1 | 5 | 3 | 2 | 4
106+
1 | 5 | 3 | 4 | 2
107+
1 | 5 | 4 | 2 | 3
108+
1 | 5 | 4 | 3 | 2
109+
2 | 1 | 3 | 4 | 5
110+
2 | 1 | 3 | 5 | 4
111+
2 | 1 | 4 | 3 | 5
112+
2 | 1 | 4 | 5 | 3
113+
2 | 1 | 5 | 3 | 4
114+
2 | 1 | 5 | 4 | 3
115+
2 | 3 | 1 | 4 | 5
116+
2 | 3 | 1 | 5 | 4
117+
2 | 3 | 4 | 1 | 5
118+
2 | 3 | 4 | 5 | 1
119+
2 | 3 | 5 | 1 | 4
120+
2 | 3 | 5 | 4 | 1
121+
2 | 4 | 1 | 3 | 5
122+
2 | 4 | 1 | 5 | 3
123+
2 | 4 | 3 | 1 | 5
124+
2 | 4 | 3 | 5 | 1
125+
2 | 4 | 5 | 1 | 3
126+
2 | 4 | 5 | 3 | 1
127+
2 | 5 | 1 | 3 | 4
128+
2 | 5 | 1 | 4 | 3
129+
2 | 5 | 3 | 1 | 4
130+
2 | 5 | 3 | 4 | 1
131+
2 | 5 | 4 | 1 | 3
132+
2 | 5 | 4 | 3 | 1
133+
3 | 1 | 2 | 4 | 5
134+
3 | 1 | 2 | 5 | 4
135+
3 | 1 | 4 | 2 | 5
136+
3 | 1 | 4 | 5 | 2
137+
3 | 1 | 5 | 2 | 4
138+
3 | 1 | 5 | 4 | 2
139+
3 | 2 | 1 | 4 | 5
140+
3 | 2 | 1 | 5 | 4
141+
3 | 2 | 4 | 1 | 5
142+
3 | 2 | 4 | 5 | 1
143+
3 | 2 | 5 | 1 | 4
144+
3 | 2 | 5 | 4 | 1
145+
3 | 4 | 1 | 2 | 5
146+
3 | 4 | 1 | 5 | 2
147+
3 | 4 | 2 | 1 | 5
148+
3 | 4 | 2 | 5 | 1
149+
3 | 4 | 5 | 1 | 2
150+
3 | 4 | 5 | 2 | 1
151+
3 | 5 | 1 | 2 | 4
152+
3 | 5 | 1 | 4 | 2
153+
3 | 5 | 2 | 1 | 4
154+
3 | 5 | 2 | 4 | 1
155+
3 | 5 | 4 | 1 | 2
156+
3 | 5 | 4 | 2 | 1
157+
4 | 1 | 2 | 3 | 5
158+
4 | 1 | 2 | 5 | 3
159+
4 | 1 | 3 | 2 | 5
160+
4 | 1 | 3 | 5 | 2
161+
4 | 1 | 5 | 2 | 3
162+
4 | 1 | 5 | 3 | 2
163+
4 | 2 | 1 | 3 | 5
164+
4 | 2 | 1 | 5 | 3
165+
4 | 2 | 3 | 1 | 5
166+
4 | 2 | 3 | 5 | 1
167+
4 | 2 | 5 | 1 | 3
168+
4 | 2 | 5 | 3 | 1
169+
4 | 3 | 1 | 2 | 5
170+
4 | 3 | 1 | 5 | 2
171+
4 | 3 | 2 | 1 | 5
172+
4 | 3 | 2 | 5 | 1
173+
4 | 3 | 5 | 1 | 2
174+
4 | 3 | 5 | 2 | 1
175+
4 | 5 | 1 | 2 | 3
176+
4 | 5 | 1 | 3 | 2
177+
4 | 5 | 2 | 1 | 3
178+
4 | 5 | 2 | 3 | 1
179+
4 | 5 | 3 | 1 | 2
180+
4 | 5 | 3 | 2 | 1
181+
5 | 1 | 2 | 3 | 4
182+
5 | 1 | 2 | 4 | 3
183+
5 | 1 | 3 | 2 | 4
184+
5 | 1 | 3 | 4 | 2
185+
5 | 1 | 4 | 2 | 3
186+
5 | 1 | 4 | 3 | 2
187+
5 | 2 | 1 | 3 | 4
188+
5 | 2 | 1 | 4 | 3
189+
5 | 2 | 3 | 1 | 4
190+
5 | 2 | 3 | 4 | 1
191+
5 | 2 | 4 | 1 | 3
192+
5 | 2 | 4 | 3 | 1
193+
5 | 3 | 1 | 2 | 4
194+
5 | 3 | 1 | 4 | 2
195+
5 | 3 | 2 | 1 | 4
196+
5 | 3 | 2 | 4 | 1
197+
5 | 3 | 4 | 1 | 2
198+
5 | 3 | 4 | 2 | 1
199+
5 | 4 | 1 | 2 | 3
200+
5 | 4 | 1 | 3 | 2
201+
5 | 4 | 2 | 1 | 3
202+
5 | 4 | 2 | 3 | 1
203+
5 | 4 | 3 | 1 | 2
204+
5 | 4 | 3 | 2 | 1
205+
(120 rows)
206+
```
207+
208+
[Count](http://info.flagcounter.com/h9V1)
209+

0 commit comments

Comments
 (0)