每个用户 ID 的 first_value 和 last_value

first_value and last_value for each user id

我正在尝试获取 scheduled_jobs table 中每个用户的第一个预定开始时间和最后一个预定结束时间。

我可以让它为一个用户工作,但是当每天尝试为所有用户工作时,我可以获得最后一次,但是第一次无法正确显示它显示的时间 user_id 所有 user_id 的。

这是我的代码:

SELECT DISTINCT on (user_id)
    user_id, first_value(scheduled_jobs.at) over (order by user_id, scheduled_jobs.at ASC),
    last_value(scheduled_jobs.to) over (order by user_id, scheduled_jobs.at DESC)
FROM scheduled_jobs
WHERE scheduled_jobs.at between CURRENT_DATE+INTERVAL'3 day' and CURRENT_DATE +INTERVAL '4 day'

当前结果示例:

user_id | first_value         | last_value
  19    | 2018-10-29 07:00:00 | 2018-10-29 17:00:00
  30    | 2018-10-29 07:00:00 | 2018-10-29 15:00:00
  37    | 2018-10-29 07:00:00 | 2018-10-29 16:30:00 

Last_value 对每个 user_id 都正确显示,但是 first_value 始终显示所有第一个 user_id 的值。

我已经尝试使用 JOIN 和 USING 查询将它们拆分为不同的 SELECT 查询,但 first_value.

的结果仍然不正确

您需要一个 PARTITION BY 子句,它根据 user_id

生成帧
SELECT DISTINCT on (user_id)
    user_id, 
    first_value(sj.at) OVER (PARTITION BY user_id ORDER BY sj.at ASC),
    last_value(sj.to) OVER (PARTITION BY user_id ORDER BY sj.at DESC)
FROM 
    scheduled_jobs sj
WHERE 
    sj.at BETWEEN CURRENT_DATE + 3 and CURRENT_DATE + 4

另外:请小心使用last_value。有时它不会按预期工作。

您应该使用 first_valueDESC 排序:

first_value(scheduled_jobs.at) over (partition by user_id order by scheduled_jobs.at DESC)

为什么不简单地使用 min()max()?由于您没有 select 任何其他列,因此不需要 distinct on() 或 window 函数开头:

SELECT user_id, 
       min(scheduled_jobs.at),
       max(scheduled_jobs.at)
FROM scheduled_jobs
WHERE scheduled_jobs.at between CURRENT_DATE + 3 and CURRENT_DATE + 4
group by user_id;

当您想要将天数添加到 DATE 值时,您不需要使用 interval,您可以只添加一个整数