PostgreSQL选择与给定时间间隔匹配的最近时间点

PostgreSQL选择与给定时间间隔匹配的最近时间点,postgresql,unique,minimum,groupwise,Postgresql,Unique,Minimum,Groupwise,我想知道我是否可以在SQL中解决以下问题,或者我最好选择脚本语言中的值,然后从中进行批量更新 有一些时间点,有一些由时间间隔的中心定义的时间间隔和从中心到中心的最大持续时间,让它们都是10分钟。中心可以彼此处于任何持续时间,点可以彼此处于任何持续时间。希望选择所有时间间隔以及一个或零个点,以便每个点不是指定给一个时间间隔,就是只指定给一个时间间隔。如果一个点匹配多个间隔,或反之亦然,则应选择点,以使点和间隔中心之间的总持续时间最小化 样本数据 interval id centertime 1 2

我想知道我是否可以在SQL中解决以下问题,或者我最好选择脚本语言中的值,然后从中进行批量更新

有一些时间点,有一些由时间间隔的中心定义的时间间隔和从中心到中心的最大持续时间,让它们都是10分钟。中心可以彼此处于任何持续时间,点可以彼此处于任何持续时间。希望选择所有时间间隔以及一个或零个点,以便每个点不是指定给一个时间间隔,就是只指定给一个时间间隔。如果一个点匹配多个间隔,或反之亦然,则应选择点,以使点和间隔中心之间的总持续时间最小化

样本数据

interval
id centertime
1 2001-01-01 12.00     # starts at 11.50 ends at 12.10
2 2001-01-01 12.15     # starts at 12.05 ends at 12.25
3 2001-01-01 12.20     # starts at 12.10 ends at 12.30

point
id time
21 2001-01-01 12.00     
22 2001-01-01 12.11
23 2001-01-01 12.17
24 2001-01-01 12.19
预期结果:

interval_id point_id
1 21
2 23
3 24
解释

点21正好匹配区间1的中心,其他的都不匹配,所以被赋值

第23点比第3点更接近区间2,但 点24更接近于3,因此区间3被指定为点24

点22是距离间隔2最近的剩余点,因此被指定

点21位于区间2内,但点22可用且更近,因此21未指定给区间,也不会出现在结果中

第23点更接近3点,因此22点是 剩下的最近的一个

好的,我知道了

它使用横向连接来计算从每个centertime到每个点的持续时间,并将其包装在附加的SELECT中,以便使用有序窗口函数仅获得最接近的匹配

SELECT * FROM (
    SELECT
        i.id as interval_id,
        p.id as point_id,
        p.duration,
        ROW_NUMBER() OVER (PARTITION BY i.id ORDER BY duration) AS rownumber
    FROM "interval" i
    LEFT JOIN LATERAL (
        SELECT
            p1.id,
            p1."time",
            ABS(EXTRACT(EPOCH FROM i.centertime - p1."time")) as duration
        FROM "point" p1
        WHERE p1."time"
            BETWEEN i.centertime - interval '10 minute'
            AND i.centertime + interval '10 minute'
     ) p on true)
     AS q
WHERE rownumber=1;

样本数据、期望的结果、清晰的解释(时间戳、时间段、重叠……这很混乱)和适当的数据库标记都会有所帮助。@GordonLinoff根据您的宝贵反馈进行了编辑。这个问题不是小事,但我希望它现在已经被清楚地定义了。如果不是因为“应该取点以最小化总持续时间”,你可以使用这样的东西:@a_horse_,带有_no_名称非常酷,我不知道横向连接。我修改了您的酷查询,这样,如果删除了所有包含重复间隔id的行,它将执行我想要的操作。更新/处理冲突可能有效,但可以在选择中完成吗@一个没有名字的马得到了一个解决方案,将你的横向连接与窗口函数相结合,以消除不必要的匹配。谢谢毕竟我没有得到它——我最终得到了一个解决方案,将这种方法与递归CTE相结合,以避免重复赋值。