【问题标题】:SQL limit by group bySQL 按组限制
【发布时间】:2015-12-10 09:21:00
【问题描述】:

这可能不是很正确的问题标题,但未能找到更好的名称。

我有以下表结构:

id | lat  | lon  | trajectory_id | time
1  | 15.8 | 17.1 | 162           | 10:01
2  | 11.5 | 59.7 | 162           | 10:02
3  | 16.4 | 79.9 | 162           | 10:03
4  | 29.5 | 10.3 | 180           | 11:12
5  | 58.2 | 11.1 | 180           | 11:13
6  | 54.5 | 14.1 | 180           | 11:14
7  | 14.9 | 15.2 | 166           | 13:40
8  | 15.0 | 13.1 | 166           | 13:42

我想获得每个轨迹的第一个点(按时间排序)。这意味着:

id | lat  | lon  | trajectory_id | time
1  | 15.8 | 17.1 | 162           | 10:01
4  | 29.5 | 10.3 | 180           | 11:12
7  | 14.9 | 15.2 | 166           | 13:40

我该怎么做?我尝试按轨迹 ID 分组,然后应用限制 1,但它限制了轨迹,而不是点本身。

【问题讨论】:

标签: sql postgresql group-by limit


【解决方案1】:
WITH CTE AS
(SELECT id,lat,lon,trajectory_id,time,
ROW_NUMBER() OVER(PARTITION BY trajectory_id ORDER BY time) rn
FROM t)
SELECT id,lat,lon,trajectory_id,time FROM CTE WHERE rn=1

【讨论】:

    【解决方案2】:

    对每个轨迹 ID 使用 ROW_NUMBER(),以便仅检索每个轨迹 ID 的第一行。

    select id, lat, lon, trajectory_id, time
    from
    (
      select 
        mytable.*, 
        row_number() over (partition by trajectory_id order by time) as rn
      from mytable
    ) numbered
    where rn = 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2021-01-11
      • 2020-07-17
      • 1970-01-01
      相关资源
      最近更新 更多