在假设的“项目”表中,“类型”值具有应用程序定义 优先级(顺序):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。