首页 > 解决方案 > 如何订购正确的方法以在单个结果集中包含多个组?

问题描述

假设我有一个带有优先级列的联系人表。优先级值为 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        |

如果我只按优先级排序,显然,它只会给我优先级为 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

标签: sqlpostgresql

解决方案


你很亲密。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;

推荐阅读