【问题标题】:More efficient way to SELECT rows from PARTITION BY从 PARTITION BY 中选择行的更有效方法
【发布时间】:2020-07-29 01:31:42
【问题描述】:

假设我有下表:

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

【问题讨论】:

    标签: sql postgresql select greatest-n-per-group window-functions


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      相关资源
      最近更新 更多