在SQL

时间:2016-12-12 21:09:46

标签: sql postgresql

我真的不认为这可以针对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组合的生成组合ID
1 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)

0 个答案:

没有答案