На самом деле это довольно просто, используя аналитическую функцию Dense_Rank:
SQL Fiddle
Настройка схемы PostgreSQL 9.6 :
CREATE TABLE Table1
("col1" varchar(4), "col2" varchar(4), "col3" varchar(1))
;
INSERT INTO Table1
("col1", "col2", "col3")
VALUES
('val1', 'valA', 'x'),
('val1', 'valA', 'y'),
('val1', 'valB', 'y'),
('val2', 'valC', 'z'),
('val3', 'valA', 'v'),
('val3', 'valA', 'r')
;
Запрос 1 :
select col1, col2, col3
, dense_rank() over (order by col1, col2) id
from table1
Результаты :
| col1 | col2 | col3 | id |
|------|------|------|----|
| val1 | valA | x | 1 |
| val1 | valA | y | 1 |
| val1 | valB | y | 2 |
| val2 | valC | z | 3 |
| val3 | valA | v | 4 |
| val3 | valA | r | 4 |