使用自定义顺序区分列

时间:2018-11-01 11:52:32

标签: database postgresql distinct database-view

我有一个数据库视图。

此时,它返回的行可能在id列中具有重复的条目。 我想执行以下操作:

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

type列可以包含3个值:

  • x
  • y
  • z

如果存在id相同但type不同的行,则DISTINCT的规则如下:

  • 首先选择类型为x的行
  • 如果没有y,请选择类型为x的行
  • 如果没有z也没有x,请选择类型为y的行

所以,如果我有3行:

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

预期结果将是

id    type
1     'x'
2     'z'

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

如果您的值按真实字母顺序(例如,在您的示例中)按顺序排序,那将非常简单-您只需对值进行排序:

JSON.parse()

demo:db<>fiddle

如果不是这样,您将需要一个表来存储排名值及其排名顺序。或者像我一样用子查询来模拟它:

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

如果类型数据确实是固定的,则可以考虑使用enum type,它是默认的有序类型。该查询看起来像上面的第一个查询:

demo: db<>fiddle

但是请注意,更改枚举(添加,删除,重新排列值)可能非常困难。因此,仅在类型确实固定的情况下才建议使用。否则,请使用单独的带有外键的表将您带回到第二部分。

答案 1 :(得分:1)

您可以将层次结构放在CASE的{​​{1}}表达式中

ORDER BY

Demo