Postgres SQL获取所有排列列

时间:2016-02-19 09:09:16

标签: postgresql

我有一张桌子,称之为items

item_id x 
A       0.1
A       0.2
B       0.25
B       0.35
C       0.4
C       0.5

我基本上希望获得所有可能的排列并对这些排列进行编号。基本上使用items_version_a.item_id <> items_version_b.item_id表上的连接,我能够得到一个确实提供所有可能组合(24行)的表。我想创建一个名为iteration的列,可能看起来像下面这样。这将提供不同排列的计数。

item_id x   iteration
A       0.1   1
A       0.1   2
A       0.1   3
A       0.1   4
A       0.2   5
A       0.2   6
A       0.2   7
A       0.2   8
B       0.25  1
B       0.25  2
B       0.25  5
B       0.25  6
B       0.35  3
B       0.35  4
B       0.35  7
B       0.35  8
C       0.4   1
C       0.4   3
C       0.4   5
C       0.4   7
C       0.5   2
C       0.5   4
C       0.5   6
C       0.5   8

顺序在技术上并不重要,但我需要iteration列来正确捕获所有排列。但是你确实在上面的例子中看到,如果你要按iteration, item_id订购,你会得到

item_id x   iteration
A       0.1     1
B       0.25    1
C       0.4     1
A       0.1     2
B       0.25    2
C       0.5     2
A       0.1     3
B       0.35    3
C       0.4     3
A       0.1     4
B       0.35    4
C       0.5     4
A       0.2     5
B       0.25    5
C       0.4     5
A       0.2     6
B       0.25    6
C       0.5     6
A       0.2     7
B       0.35    7
C       0.4     7
A       0.2     8
B       0.35    8
C       0.5     8

你可以看到每个迭代都捕获了一个独特的排列。

1 个答案:

答案 0 :(得分:0)

select
*
, row_number() over(partition by a.item_id order by b.x, a.x) as iteration
from ( ...

您可以使用ROW_NUMBER()生成迭代列,通过OVER(...)子句,分区值的更改会将计数器重置为1,而order by控制计数器的序列如何递增。

SQL Fiddle

PostgreSQL 9.3架构设置

CREATE TABLE items
    (item_id varchar(1), x decimal(8,2))
;

INSERT INTO items
    (item_id, x)
VALUES
    ('A', 0.1),
    ('A', 0.2),
    ('B', 0.25),
    ('B', 0.35),
    ('C', 0.4),
    ('C', 0.5)
;

查询1

select
      a.item_id
    , a.x
    , row_number() over(partition by a.item_id order by b.x, a.x) as iteration
    , b.x
from items a
inner join items b on a.item_id <> b.item_id
order by
      iteration
    , a.item_id
    , a.x

<强> Results

| item_id |    x | iteration |    x |
|---------|------|-----------|------|
|       A |  0.1 |         1 | 0.25 |
|       B | 0.25 |         1 |  0.1 |
|       C |  0.4 |         1 |  0.1 |
|       A |  0.2 |         2 | 0.25 |
|       B | 0.35 |         2 |  0.1 |
|       C |  0.5 |         2 |  0.1 |
|       A |  0.1 |         3 | 0.35 |
|       B | 0.25 |         3 |  0.2 |
|       C |  0.4 |         3 |  0.2 |
|       A |  0.2 |         4 | 0.35 |
|       B | 0.35 |         4 |  0.2 |
|       C |  0.5 |         4 |  0.2 |
|       A |  0.1 |         5 |  0.4 |
|       B | 0.25 |         5 |  0.4 |
|       C |  0.4 |         5 | 0.25 |
|       A |  0.2 |         6 |  0.4 |
|       B | 0.35 |         6 |  0.4 |
|       C |  0.5 |         6 | 0.25 |
|       A |  0.1 |         7 |  0.5 |
|       B | 0.25 |         7 |  0.5 |
|       C |  0.4 |         7 | 0.35 |
|       A |  0.2 |         8 |  0.5 |
|       B | 0.35 |         8 |  0.5 |
|       C |  0.5 |         8 | 0.35 |