postgresql:基于区间的子分组列

lpwwtiir  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(536)

我有以下表格:

  1. SELECT * FROM trajectories
  2. LIMIT 10;
  3. user_id | session_id | timestamp | lat | lon | alt
  4. ---------+-------------------+------------------------+-----------+------------+------
  5. 11 | 10020071017220238 | 2007-10-18 02:51:38+01 | 37.780927 | 113.677553 | 2160
  6. 11 | 10020071017220238 | 2007-10-18 02:51:39+01 | 37.78093 | 113.677627 | 2160
  7. 11 | 10020071017220238 | 2007-10-18 02:51:40+01 | 37.780932 | 113.677698 | 2160
  8. 11 | 10020071017220238 | 2007-10-18 02:51:41+01 | 37.780938 | 113.677772 | 2159
  9. 11 | 10020071017220238 | 2007-10-18 02:51:42+01 | 37.780945 | 113.677845 | 2159
  10. 11 | 10020071017220238 | 2007-10-18 02:51:43+01 | 37.780952 | 113.677918 | 2159
  11. 11 | 10020071017220238 | 2007-10-18 02:51:44+01 | 37.780962 | 113.67799 | 2159
  12. 11 | 10020071017220238 | 2007-10-18 02:51:45+01 | 37.780973 | 113.67806 | 2159
  13. 11 | 10020071017220238 | 2007-10-18 02:51:46+01 | 37.78098 | 113.678128 | 2159
  14. 11 | 10020071017220238 | 2007-10-18 02:51:47+01 | 37.780992 | 113.678192 | 2157
  15. (10 rows)
  16. SELECT * FROM labels
  17. WHERE travel mode = 'subway'
  18. LIMIT 10
  19. user_id | session_id | start_timestamp | end_timestamp | travelmode
  20. ---------+------------+------------------------+------------------------+------------
  21. 11 | 0 | 2008-06-18 04:46:10+01 | 2008-06-18 04:54:59+01 | subway
  22. 11 | 0 | 2008-08-01 02:51:47+01 | 2008-08-01 03:37:43+01 | subway
  23. 11 | 0 | 2008-08-01 03:59:36+01 | 2008-08-01 04:30:20+01 | subway
  24. 11 | 0 | 2008-09-16 00:58:43+01 | 2008-09-16 01:07:14+01 | subway
  25. 11 | 0 | 2008-09-16 11:49:05+01 | 2008-09-16 12:03:05+01 | subway
  26. 11 | 0 | 2008-09-18 00:41:41+01 | 2008-09-18 00:50:43+01 | subway
  27. 11 | 0 | 2008-09-18 10:43:23+01 | 2008-09-18 10:53:03+01 | subway
  28. 11 | 0 | 2008-09-19 10:46:56+01 | 2008-09-19 10:56:10+01 | subway
  29. 11 | 0 | 2008-09-21 23:58:45+01 | 2008-09-22 00:07:41+01 | subway
  30. 11 | 0 | 2008-09-22 11:14:52+01 | 2008-09-22 11:24:30+01 | subway
  31. (10 rows)

几乎有 5M 带有标记的旅行模式的点:

  1. SELECT COUNT(*)
  2. FROM trajectories t
  3. JOIN labels l
  4. ON t.user_id = l.user_id
  5. WHERE t.timestamp >= l.start_timestamp AND t.timestamp <= l.end_timestamp
  6. count
  7. ---------
  8. 4931303
  9. (1 row)

但是我想知道 subway 基于间隔的模式(英寸 trajectories 表),即有多少点落在 1-5 seconds, 5-10 seconds, 10- 20seconds 及以上 20 seconds

pieyvz9o

pieyvz9o1#

可以使用条件聚合:

  1. SELECT COUNT(*),
  2. COUNT(*) FILTER (WHERE end_timestamp >= start_timestamp AND end_timestamp < start_timestamp + interval '5 second'),
  3. COUNT(*) FILTER (WHERE end_timestamp >= start_timestamp + interval '5 second' AND end_timestamp < start_timestamp + interval '10 second'),
  4. . . .
  5. FROM trajectories t JOIN
  6. labels l
  7. ON t.user_id = l.user_id
  8. WHERE t.timestamp >= l.start_timestamp AND t.timestamp <= l.end_timestamp

相关问题