Postgresql根据条件选择行窗口

时间:2017-12-14 21:52:46

标签: sql postgresql

我有不同的汽车旅行的汽车旅行数据。相关栏目是

  1. id - varchar(32)
  2. sequence - integer - 对于新的汽车旅行重置为1
  3. timestamp - 设备记录gps数据的时间。它在下面的图片中显示为日期,但假设为时间戳
  4. 纬度 - 数字
  5. 经度
  6. 我试图找出特定起点和目的地点之间的汽车旅行。如果我输入原点为40.34,23.5,目的地为40.75,23.9,那么输出将如第二张图所示。

    第一张照片包含2次汽车旅行,即abc& DEF。 'abc'发生在12月18日,'def'发生于12月15日,因此def出现在输出中。输出表按时间戳列和序列列排序,并按ID分组。输出还应包含起点和终点之间的中间点。

    我无法弄清楚如何找到通过特定点的第一次旅行。

    输入:

    enter image description here

    输出:

    enter image description here

2 个答案:

答案 0 :(得分:1)

尝试row_number() over()

SELECT
      *
FROM (
      SELECT
            t.*
          , ROW_NUMBER() OVER (PARTITION BY id ORDER BY sequence, timestamp) AS rn
      FROM yourtable t
      WHERE Latitude = 40.34
      AND Longitude = 23.5
      ) d
WHERE rn = 1

nb:不确定订购时是否需要时间戳,但也许可以作为平局使用。

答案 1 :(得分:1)

假设您的car trip data表名为trips

WITH starts_and_ends AS (
    SELECT
        starts.id,
        starts.sequence AS start_sequence,
        ends.sequence AS end_sequence
    FROM
        trips AS starts
        JOIN trips AS ends
        ON (starts.id = ends.id AND starts.sequence < ends.sequence)
    WHERE
        starts.latitude = 40.34 AND
        starts.longitude = 23.50 AND
        ends.latitude = 40.75 AND
        ends.longitude = 23.90
)
SELECT
    trips.*
FROM
    starts_and_ends,
    trips
WHERE
    trips.id = starts_and_ends.id AND
    sequence BETWEEN starts_and_ends.start_sequence AND starts_and_ends.end_sequence
ORDER BY
    trips.id,
    trips.sequence,
    trips.timestamp;

WITH查询中,我选择起点和终点ID以及序列号。然后将其与原始表格一起显示行程。

输出:

abc 2   2017-12-18 40.34    23.50
abc 3   2017-12-18 40.56    23.80
abc 4   2017-12-18 40.75    23.90
def 2   2017-12-15 40.34    23.50
def 3   2017-12-15 40.55    23.59
def 4   2017-12-15 40.80    23.99
def 5   2017-12-15 40.75    23.90