假设我有一个具有优先级列的联系人表。 优先级值为1-3。 我想选择联系人12个联系人,并且应该在此处列出所有优先级的联系人-4个优先级为1、4-优先级2和4-优先级3的联系人。
FIRST_NAME | LAST_NAME | PRIORITY |
-----------|-----------|----------|
A | AB | 1 |
qwerty | AB | 1 |
Efr | AB | 1 |
University | AB | 1 |
United | AB | 2 |
Art | AB | 2 |
Falco | AB | 2 |
Some | AB | 2 |
123 | AB | 3 |
Greeb | AB | 3 |
Greea | AB | 3 |
Greem | AB | 3 |
如果我仅按优先级进行ORDER BY,显然,它只会给我仅优先级为1的联系人,然后才是其他优先级的联系人。
我以为我可以在这里使用PostgreSQL窗口函数,但是不确定,仍然可以做到。
SELECT * FROM
(SELECT
first_name, last_name, priority, created_at,
ROW_NUMBER() OVER (PARTITION BY priority ORDER BY created_at ASC) AS rank FROM contacts
) c
LIMIT 10
答案 0 :(得分:1)
你很近。代替使用LIMIT
,您需要将结果集限制为仅行号小于或等于4(对于每个优先级分区)的记录。
SELECT first_name, last_name, priority, created_at
FROM
(
SELECT c.*,
ROW_NUMBER() OVER (PARTITION BY priority ORDER BY created_at) AS rn
FROM contacts c
) t
WHERE rn <= 4;