【问题标题】:Highest for each group, with count每组最高,有计数
【发布时间】: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


【解决方案1】:

你应该试试这样的:

        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;

【讨论】:

  • 感谢您的回答;实际上我不想按projects.name 进行分区,我希望每个用户有一行,无论他们的任务与多少项目相关联。但我仍然想要与最大到期日期的任务相关联的项目名称。
  • 感谢 Bulat,感谢您的回答,终于可以让它工作了。
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多