如何在自定义排序后仅选择第一组结果?

时间:2018-01-16 21:15:40

标签: sql postgresql

在假设的“项目”表中,“类型”值具有应用程序定义 优先级(顺序):B之前的C之前的A.这个优先级不属于 数据库,可以在查询之间进行更改。

 id | owner_id | type |   name
----+----------+------+----------
  1 |        1 | A    | a item 1
  2 |        1 | A    | a item 2
  3 |        1 | B    | b item 1
  4 |        1 | B    | b item 2
  5 |        1 | C    | c item 1
  6 |        1 | C    | c item 2
  7 |        1 | D    | d item 1
  8 |        2 | A    | a item 3
  9 |        2 | C    | c item 3

我可以获得一个项目所有者的列表,按类型优先级排序:

 id | type |   name
----+------+----------
  3 | B    | b item 1
  4 | B    | b item 2
  5 | C    | c item 1
  6 | C    | c item 2
  1 | A    | a item 1
  2 | A    | a item 2

SQL:

  SELECT  id,
          type,
          name
    FROM  items
   WHERE  owner_id = 1
          AND type IN ('A', 'B', 'C')
ORDER BY  type != 'B',
          type != 'C',
          type != 'A',
          name;

现在我想只选择第一组类型(两个B项)。如果 没有B项,我想要所有C项,依此类推。

我可以使用单独的查询或自联接或CTE来查找顶部类型, 但我想知道是否有更简单或更优雅的方式来获得 在应用ORDER BY之后的第一组结果。

例如,如果我可以对组进行排名,我可以从中选择排名1 外部查询,但我似乎无法获得正确的分区/排名。什么时候 我选择了

dense_rank() OVER (PARTITION BY type)

dense_rank()的所有值均为1。

0 个答案:

没有答案