Postgres为组创建ID

时间:2018-11-27 21:57:15

标签: sql postgresql window-functions

我正在尝试解决一个一开始看起来很简单但找不到任何(简单)解决方案的问题

我有一个包含多列的表,我想在由某些列定义的组上创建一个ID

更好地在示例中显示三列,我想在由col1和col2定义的组上具有ID,这看起来像是窗口函数的工作,但是我却以某种方式失败了

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

1 个答案:

答案 0 :(得分:4)

实际上,使用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

Results

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