从 PARTITION BY 到 SELECT 行的更有效方法

More efficient way to SELECT rows from PARTITION BY

假设我有以下 table:

+----+-------------+-------------+
| id | step_number | employee_id |
+----+-------------+-------------+
|  1 |           1 |           3 |
|  1 |           2 |           3 |
|  1 |           3 |           4 |
|  2 |           2 |           3 |
|  2 |           3 |           4 |
|  2 |           4 |           5 |
+----+-------------+-------------+

我想要的结果是:

+----+-------------+-------------+
| id | step_number | employee_id |
+----+-------------+-------------+
|  1 |           1 |           3 |
|  2 |           2 |           3 |
+----+-------------+-------------+

我目前的解决方案是:

SELECT
    *
FROM
(SELECT
    id,
    step_number,
    MIN(step_number) OVER (PARTITION BY id) AS min_step_number,
    employee_id
FROM
    table_name) AS t
WHERE
    t.step_number = t.min_step_number

有没有更有效的方法可以做到这一点?

我目前正在使用 postgresql,版本 12。

在 Postgres 中,我建议使用 distinct on 来解决这个最大的每组 n 问题:

select distinct on (id) t.*
from mytbale t
order by id, step_number

这个 SQL 标准的 Postgres 扩展通常比使用 window 函数的标准方法具有更好的性能(而且,作为奖励,语法更简洁)。

请注意,这假定 (id, step_number) 元组的唯一性:否则,结果可能与您的查询结果不同(允许联系,而 distinct on 不允许)。