每组最高,有计数
Highest for each group, with count
我正在使用 PostgreSQL 并且有下表:
用户
身份证名称
1乔
2插孔
项目
身份证名称
1p1
2p2
任务
id 名称 user_id project_id due_on
1 t1 1 1 2015-02-17
2吨2 1 2 2015-02-18
3 吨 2 1 2015-02-19
我想构建一个查询,该查询 returns 每个用户至少有一个任务在 2012 年 1 月 1 日之后到期。它应该列出用户名、用户的任务数、最远任务的日期以及与最远任务关联的项目名称。
根据上面的表格,结果应该是
user_name 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
有什么方法可以实现我所需要的吗?
编辑:是工作查询,稍微改编自 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
你应该尝试这样的事情:
select user_name, due_on, task_count, project_name
from (
SELECT
users.name,
projects.project_name,
tasks.due_on,
count(*) over (partition by user_name, project_name order by id desc) as AS task_count,
row_number() over (partition by user_name, project_name order by id 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_at > '2012-01-01'
) t
where rn = 1
order by id;
我正在使用 PostgreSQL 并且有下表:
用户 身份证名称 1乔 2插孔
项目 身份证名称 1p1 2p2
任务 id 名称 user_id project_id due_on 1 t1 1 1 2015-02-17 2吨2 1 2 2015-02-18 3 吨 2 1 2015-02-19
我想构建一个查询,该查询 returns 每个用户至少有一个任务在 2012 年 1 月 1 日之后到期。它应该列出用户名、用户的任务数、最远任务的日期以及与最远任务关联的项目名称。
根据上面的表格,结果应该是
user_name 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
有什么方法可以实现我所需要的吗?
编辑:是工作查询,稍微改编自 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
你应该尝试这样的事情:
select user_name, due_on, task_count, project_name
from (
SELECT
users.name,
projects.project_name,
tasks.due_on,
count(*) over (partition by user_name, project_name order by id desc) as AS task_count,
row_number() over (partition by user_name, project_name order by id 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_at > '2012-01-01'
) t
where rn = 1
order by id;