每组最高,有计数

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;