从 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
不允许)。
假设我有以下 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
不允许)。