选择分组查询的前 n 行

axo*_*xon 1 sql postgresql select count greatest-n-per-group

我将 PostgreSQL 与 SQLAlchemy 一起使用

我有一个 GPS 指标表,格式如下:

SELECT * FROM user_gps_location;
Run Code Online (Sandbox Code Playgroud)

我的输出:

| 编号 | 用户 ID | 进入时间 | 纬度 | 液化天然气| 准确度 | 海拔高度 | 速度|
| 1 | 54 | 54 2020-07-24 14:08:30.000000 | 54.42184220 | -110.21029370 | 41.42 | 41.42 512.40 | 512.40 0.07 | 0.07
| 2 | 54 | 54 2020-07-24 22:20:12.000000 | 54.42189750 | -110.21038070 | 13.00 | 512.60 | 512.60 0.00 | 0.00
| 3 | 26 | 26 2020-07-27 13:51:11.000000 | 54.41453910 | -110.20775990 | 1300.00 | 0.00 | 0.00 0.00 | 0.00
| 4 | 26 | 26 2020-07-27 22:59:00.000000 | 54.42122590 | -110.20959960 | 257.52 | 257.52 509.10 | 509.10 0.00 | 0.00
| 5 | 26 | 26 2020-07-28 13:54:12.000000 | 54.42185280 | -110.21025010 | 81.45 | 81.45 510.20 | 510.20 0.00 | 0.00
...

我需要能够回答这个问题“自“”以来每个用户的最新 5 条条目是什么,排序依据entry_time

现在我只有一个基本查询:

| id | user_id | entry_time                 | lat         | lng           | accuracy | altitude | speed |
| 1  | 54      | 2020-07-24 14:08:30.000000 | 54.42184220 | -110.21029370 |    41.42 |   512.40 |  0.07 |
| 2  | 54      | 2020-07-24 22:20:12.000000 | 54.42189750 | -110.21038070 |    13.00 |   512.60 |  0.00 |
| 3  | 26      | 2020-07-27 13:51:11.000000 | 54.41453910 | -110.20775990 |  1300.00 |     0.00 |  0.00 |
| 4  | 26      | 2020-07-27 22:59:00.000000 | 54.42122590 | -110.20959960 |   257.52 |   509.10 |  0.00 |
| 5  | 26      | 2020-07-28 13:54:12.000000 | 54.42185280 | -110.21025010 |    81.45 |   510.20 |  0.00 |
...

应用限制不会达到我想要的效果。我假设我需要使用分组和窗口函数(?),但我不理解它们。

Mur*_*nik 5

row_number功能正是您正在寻找的:

SELECT * 
FROM   (SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY entry_time DESC) AS rn
        FROM   user_gps_location
        WHERE  entry_time > '2020-09-01') t
WHERE  rn <= 5
Run Code Online (Sandbox Code Playgroud)