我真的不认为这可以针对n行进行,但很乐意了解以下问题如何作为示例展示:
考虑这组2列t和f,共5行:
CREATE TABLE foo AS
SELECT * FROM ( VALUES
('t1','f1'),
('t1','f2'),
('t1','f3'),
('t2','f1'),
('t2','f2')
) AS t(col1, col2);
col1 | col2
------+------
t1 | f1
t1 | f2
t1 | f3
t2 | f1
t2 | f2
如何查询此结果,左侧int列应为列t
的SET组合的生成组合ID1 t1 f1
2 t1 f2
3 t1 f3
4 t1 f1
4 t1 f2
5 t1 f2
5 t1 f3
6 t1 f1
6 t1 f3
7 t1 f1
7 t1 f2
7 t1 f3
8 t2 f1
9 t2 f2
10 t2 f1
10 t2 f2
然后,这将允许使用按生成的集合ID
分组的聚合至于澄清:据我所知,只有3个col2值,我可以选择10个组合作为10行这样的(请注意,组合ID与思想不同)上面的例子):
CREATE TEMP sequence cid;
SELECT nextval('cid') AS combo, *
FROM (
SELECT col1, col2, null, null
FROM foo
UNION
SELECT f1.col1, f1.col2, f2.col2, null
FROM foo f1
JOIN foo f2 ON f1.col1 = f2.col1 AND f1.col2 < f2.col2
UNION
SELECT f1.col1, f1.col2, f2.col2, f3.col2
FROM foo f1
JOIN foo f2 ON f1.col1 = f2.col1 AND f1.col2 < f2.col2
JOIN foo f3 ON f2.col1 = f3.col1 AND f2.col2 < f3.col2
) bar
ORDER BY 1,2,3,4,5
;
combo | col1 | col2 | ?column? | ?column?
-------+------+------+----------+----------
1 | t1 | f1 | f2 |
2 | t2 | f1 | f2 |
3 | t1 | f3 | |
4 | t1 | f1 | |
5 | t1 | f2 | f3 |
6 | t1 | f1 | f2 | f3
7 | t2 | f2 | |
8 | t1 | f1 | f3 |
9 | t2 | f1 | |
10 | t1 | f2 | |
(10 rows)