Более эффективный способ ВЫБРАТЬ строки из PARTITION BY - PullRequest
1 голос
/ 16 апреля 2020

Предположим, у меня есть следующая таблица:

+----+-------------+-------------+
| 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.

1 Ответ

4 голосов
/ 16 апреля 2020

В Postgres я бы порекомендовал использовать distinct on для решения этой проблемы с наибольшим числом групп:

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

Это расширение Postgres стандарта SQL обычно лучше производительность по сравнению со стандартным подходом с использованием оконных функций (и, в качестве бонуса, синтаксис аккуратнее).

Обратите внимание, что это предполагает уникальность (id, step_number) кортежей: в противном случае результаты могут отличаться от результатов запроса (который разрешает связи, а distinct on - нет).

...