|
野花要的X=20的分配策略,原来竟是如此简单!
平均分成五组,每组四个点。
取第一组,从点1开始。令点1指向第二组所有的点,点2指向第三组所有的点,...四个组刚好分配给四个点。
对其他组做同样的分配动作。
WITH p AS
(SELECT LEVEL p,CEIL(LEVEL/4) g,ROW_NUMBER() OVER(PARTITION BY CEIL(LEVEL/4) ORDER BY LEVEL) rn
FROM DUAL
CONNECT BY LEVEL<=20)
,g AS (
SELECT p from_p,to_p
FROM (
SELECT p1.*,p2.p to_p,DENSE_RANK() OVER(PARTITION BY p1.g ORDER BY p2.g) rnk
FROM p p1,p p2
WHERE p1.g<>p2.g
)
WHERE rn=rnk
) ----- 至此分配完毕
SELECT from_p,COUNT(DISTINCT to_p) FROM (
SELECT g1.from_p
,g2.to_p
FROM g g1, g g2
WHERE g1.to_p=g2.from_p
UNION ALL
SELECT * FROM g
)
GROUP BY from_p;
FROM_P COUNT(DISTINCTTO_P)
---------- -------------------
1 20
2 20
3 20
4 20
5 20
6 20
7 20
8 20
9 20
10 20
11 20
12 20
13 20
14 20
15 20
16 20
17 20
18 20
19 20
20 20
20 rows selected.
WITH p AS
(SELECT LEVEL p,CEIL(LEVEL/4) g,ROW_NUMBER() OVER(PARTITION BY CEIL(LEVEL/4) ORDER BY LEVEL) rn
FROM DUAL
CONNECT BY LEVEL<=20)
,g AS (
SELECT p from_p,to_p
FROM (
SELECT p1.*,p2.p to_p,DENSE_RANK() OVER(PARTITION BY p1.g ORDER BY p2.g) rnk
FROM p p1,p p2
WHERE p1.g<>p2.g
)
WHERE rn=rnk
) ----- 至此分配完毕
SELECT from_p,SUM(in_cnt),SUM(out_cnt)
FROM (
SELECT from_p,0 in_cnt,COUNT(*) out_cnt FROM g GROUP BY from_p
UNION ALL
SELECT to_p,COUNT(*),0 FROM g GROUP BY to_p
)
GROUP BY from_p
ORDER BY 1;
FROM_P SUM(IN_CNT) SUM(OUT_CNT)
---------- ----------- ------------
1 4 4
2 4 4
3 4 4
4 4 4
5 4 4
6 4 4
7 4 4
8 4 4
9 4 4
10 4 4
11 4 4
12 4 4
13 4 4
14 4 4
15 4 4
16 4 4
17 4 4
18 4 4
19 4 4
20 4 4
20 rows selected.
|
|