2016-02-19 4 views
0

я имел таблицу, назовем его itemsPostgres SQL Получить все перестановки столбцов

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
select 
* 
, row_number() over(partition by a.item_id order by b.x, a.x) as iteration 
from (... 

Вы можете использовать ROW_NUMBER(), чтобы сгенерировать столбец итерации, через (...) п OVER изменение значения раздела сбрасывает счетчик на 1, и порядок по контролей, как последовательность из счетчик.

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 | 
+0

Я думал об этом, но это на самом деле не работает. Причина в том, что он фактически не группирует перестановки правильно. Если вы выполняете 'row_number() поверх (разделение по порядку a.item_id от ax) как уведомление об итерации, то для итерации 1 вы получите A = 0,1, B = 0,25 и C = 0,4, но вы также получите то же самое для итерации 2 – Vincent

+0

Интересно, поможет ли здесь меньший пример, содержащий только 2 элемента, а не 3. – Vincent

+0

это ближе? –