【发布时间】:2015-02-17 15:59:29
【问题描述】:
我正在使用 PostgreSQL 并且有以下表格:
用户 身份证名称 1 乔 2 插孔 项目 身份证名称 1 p1 2 p2 任务 id 名称 user_id project_id due_on 1 t1 1 1 2015-02-17 2 t2 1 2 2015-02-18 3 t3 2 1 2015-02-19我想构建一个查询,该查询为每个在 2012 年 1 月 1 日之后至少有一个任务到期的用户返回一行。它应该列出用户名、用户的任务数、最远任务的日期以及与该最远任务关联的项目名称。
上面的表格结果应该是
用户名 max_due_on task_count project_name 乔 2015-02-18 2 p2 千斤顶 2015-02-19 1 p1我已经构建了以下查询,但它缺少与最远到期任务关联的项目名称。
SELECT
users.name AS user_name,
max(tasks.due_on) AS max_due_on,
count(*) AS task_count
FROM tasks
LEFT JOIN users ON users.id = tasks.user_id
LEFT JOIN projects ON projects.id = tasks.project_id
WHERE
tasks.due_at > '2012-01-01'
GROUP BY users.name
有没有办法实现我的需要?
编辑:is 是工作查询,稍微改编自 Bulat 的回答:
SELECT user_name, due_at, task_count, project_name
from (
SELECT
users.name AS user_name,
projects.name AS project_name,
tasks.due_on,
count(*) OVER (PARTITION BY users.name) AS task_count,
row_number() over (PARTITION BY users.name ORDER BY tasks.due_on DESC) AS rn
FROM tasks
LEFT JOIN users ON users.id = tasks.user_id
LEFT JOIN projects ON projects.id = tasks.project_id
WHERE tasks.due_on > '2012-01-01'
) t
WHERE rn = 1
ORDER by user_name
【问题讨论】:
标签: sql postgresql group-by greatest-n-per-group