首页 > 解决方案 > SQL - 根据其他变量获取第 N 行

问题描述

所以我试图让每个司机完成第 N 个trip_id(每次旅行唯一)。例如,每个 driver_id (每个驱动程序唯一)的第三次完成行程,我的数据库表如下所示:

id    datetime    driver_id  trip_id   trip_status
---|------------|----------|---------|--------------|
1  | 03/03/2009 | 1111     |   1     |  completed   |
2  | 04/03/2009 | 1111     |   2     |  cancelled   |
3  | 05/03/2009 | 2222     |   1     |  completed   |
4  | 05/03/2009 | 2222     |   2     |  completed   |
5  | 06/03/2009 | 2222     |   2     |  cancelled   |
6  | 06/03/2009 | 2222     |   4     |  completed   |
7  | 06/03/2009 | 3333     |   1     |  completed   |
8  | 06/03/2009 | 3333     |   2     |  completed   |
9  | 06/03/2009 | 3333     |   3     |  completed   |

并希望我的结果是这样的:

id    datetime    driver_id  trip_id   trip_status
---|------------|----------|---------|--------------|
6  | 06/03/2009 | 2222     |   4     |  completed   |
9  | 06/03/2009 | 3333     |   3     |  completed   |

标签: sql

解决方案


您可以使用row_number()窗口函数获取按datetime分区排序的记录的行号driver_id

SELECT id,
       ...
       trip_status
       FROM (SELECT id,
                    ...
                    trip_status,
                    row_number() OVER (PARTITION BY driver_id
                                       ORDER BY datetime) rn
                    FROM elbat
                    WHERE trip_status = 'completed')
       WHERE rn = 3;

推荐阅读