我有一张桌子,称之为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
你可以看到每个迭代都捕获了一个独特的排列。
答案 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控制计数器的序列如何递增。
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 |