根据一列对连续的行进行分组
Group consecutive rows based on one column
假设我从 select * from journeys
:
的结果中得到这个 table
timestamp | inJourney (1 = true and 0 = false)
--------------------------------------------------
time1 | 1
time2 | 1
time3 | 1
time4 | 0
time5 | 0
time6 | 1
time7 | 1
time8 | 1
预计:
timestamp | inJourney (1 = true and 0 = false)
--------------------------------------------------
time1 | 1
time4 | 0
time8 | 1
注意:时间戳不重要,因为我只想统计行程数
知道我必须做什么吗?
这是一个缺口和孤岛问题。使用row_number()
:
之差
select injourney, min(timestamp), max(timestamp)
from (select t.*,
row_number() over (order by timestamp) as seqnum,
row_number() over (partition by injourney, order by timestamp) as seqnum_i
from t
) t
group by injourney, (seqnum - seqnum_i)
order by min(timestamp);
这是一个间隙和孤岛问题,你可以尝试使用ROW_NUMBER
window函数从结果集中获取间隙然后使用MIN
你可以试试这个。
查询#1
SELECT MIN(timestamp),inJourney
FROM (
SELECT *,
ROW_NUMBER() OVER(ORDER BY timestamp) - ROW_NUMBER() OVER(PARTITION BY inJourney ORDER BY timestamp) grp
FROM journeys
) t1
GROUP BY grp,inJourney
ORDER BY MIN(timestamp);
| min | injourney |
| ----- | --------- |
| time1 | 1 |
| time4 | 0 |
| time6 | 1 |
假设我从 select * from journeys
:
timestamp | inJourney (1 = true and 0 = false)
--------------------------------------------------
time1 | 1
time2 | 1
time3 | 1
time4 | 0
time5 | 0
time6 | 1
time7 | 1
time8 | 1
预计:
timestamp | inJourney (1 = true and 0 = false)
--------------------------------------------------
time1 | 1
time4 | 0
time8 | 1
注意:时间戳不重要,因为我只想统计行程数
知道我必须做什么吗?
这是一个缺口和孤岛问题。使用row_number()
:
select injourney, min(timestamp), max(timestamp)
from (select t.*,
row_number() over (order by timestamp) as seqnum,
row_number() over (partition by injourney, order by timestamp) as seqnum_i
from t
) t
group by injourney, (seqnum - seqnum_i)
order by min(timestamp);
这是一个间隙和孤岛问题,你可以尝试使用ROW_NUMBER
window函数从结果集中获取间隙然后使用MIN
你可以试试这个。
查询#1
SELECT MIN(timestamp),inJourney
FROM (
SELECT *,
ROW_NUMBER() OVER(ORDER BY timestamp) - ROW_NUMBER() OVER(PARTITION BY inJourney ORDER BY timestamp) grp
FROM journeys
) t1
GROUP BY grp,inJourney
ORDER BY MIN(timestamp);
| min | injourney |
| ----- | --------- |
| time1 | 1 |
| time4 | 0 |
| time6 | 1 |