每个用户 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_value
和 DESC
排序:
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
,您可以只添加一个整数
我正在尝试获取 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_value
和 DESC
排序:
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
,您可以只添加一个整数