SQL 按分组限制
SQL limit by group by
这可能不是很正确的问题标题,但未能找到更好的名称。
我有以下 table 结构:
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
我该怎么做?我尝试按 trajectory_id 分组,然后应用限制 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
每个 trajectory_id 使用 ROW_NUMBER() 以便仅检索每个 trajectory_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;
这可能不是很正确的问题标题,但未能找到更好的名称。
我有以下 table 结构:
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
我该怎么做?我尝试按 trajectory_id 分组,然后应用限制 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
每个 trajectory_id 使用 ROW_NUMBER() 以便仅检索每个 trajectory_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;