代码之家  ›  专栏  ›  技术社区  ›  Andrey Deineko

使用自定义顺序在列上区分

  •  0
  • Andrey Deineko  · 技术社区  · 6 年前

    我有DB视图。

    id 列。

    SELECT DISTINCT ON (id) USING DESCRIBED BELOW RULE -- of course it is not valid sql
      id
      type
    

    type 列可以有3个值:

    • x
    • y
    • z

    如果有行具有相同的 但不一样 类型 ,的规则 DISTINCT 具体如下:

    • 选择类型为的行
    • 选择类型为的行 Y 如果没有
    • 选择类型为的行 如果没有 而且没有

    id    type
    1     'y'
    1     'x'
    2     'z'
    

    预期结果将是

    id    type
    1     'x'
    2     'z'
    

    有办法做到这一点吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Kaushik Nayak    6 年前

    你可以把等级划分成 CASE 中的表达式 ORDER BY

    SELECT DISTINCT ON (id) * 
    FROM   ( VALUES (1, 'y'), 
                    (1, 'x'), 
                    (2, 'z') ) s(id, type) 
    ORDER  BY id, 
              CASE type 
                WHEN 'x' THEN 1 
                WHEN 'y' THEN 2 
                WHEN 'z' THEN 3 
              END; 
    

    Demo

        2
  •  1
  •   S-Man    6 年前

    如果您的值是按实数字母顺序排列的(如您的示例中所示),那就非常简单了—您只需对值进行排序:

    SELECT DISTINCT ON (id)
        id,
        type
    FROM mytable m
    ORDER BY id, type
    

    demo:db<>fiddle

    SELECT DISTINCT ON (id)
        id,
        type
    FROM mytable m
    JOIN (VALUES (1, 'x'), (2, 'y'), (3, 'z')) AS r (rank_id,value)
    ON r.value = m.type
    ORDER BY id, r.rank_id
    

    enum type 默认情况下是有序类型。查询将类似于上面的第一个:

    demo: db<>fiddle

    但是请注意,更改枚举(添加、删除、重新排列值)可能非常困难。因此,只有在类型确实已修复时才建议使用。否则,使用一个带有外键的单独表返回到第二部分。