2

Aprojectには がたくさんありtasksます。Ataskは、多くの のいずれかで処理できますusers。例えば:

Project    Task      By
-------  --------  ------
  P1        T1       U1
            T2       U2
  P2        T1       U3
            T2       U4
            T3       U5
  P3        T1       U1
            T2       U3
            T3       U5
  P4        T1       U1
            T2       U3

count ofユーザーが処理するプロジェクトの最後のタスクを照会するにはどうすればよいですか? 出力レポートは次のようになります。

  Task   By   Count
  ----  ----  -----
   T2    U2     1
   T2    U3     1
   T3    U5     2

UPDATE:(Deefoursのコメント用):最後のタスクの数を取得するために行ったことは次のとおりです(ただし、By列を取得する方法はわかりません):

self.find_by_sql('select task_id, count(task_id) as "count"
from (
        select task_id
        from (
                select * from tasks order by created_at desc
             )
        tasks_sorted 
        group by project_id
     )
latest_tasks 
group by task_id;')
4

4 に答える 4

1

これはあなたが探しているクエリです:

SELECT t.task_id, u.user_id, count(*) as "count"
FROM project p
INNER JOIN (
    SELECT project_id, MAX(created_at) as "created_at" FROM task GROUP BY project_id
) last_task ON p.project_id=last_task.project_id
INNER JOIN task t ON t.created_at=last_task.created_at
INNER JOIN users u ON t.user_id=u.user_id
GROUP BY t.task_id, u.user_id

現在実行できないため、機能しなかった場合はお知らせください。

于 2012-08-24T14:34:51.547 に答える
0
 select task_id, user_id, count(user_id) as "count" from (
   select task_id, user_id from (
     select * from (
        select * from tasks order by tasks.created_at desc
     ) last_tasks group by project_id
   ) tasks_by_users INNER JOIN users ON tasks.task_id = tasks_users.task_id
 ) workload group by task_id, user_id;
于 2012-08-21T06:20:44.087 に答える
0

以下のクエリを使用します。

SELECT P.task_id, P.user_id, count(*) as "count"
FROM project p
INNER JOIN task t ON t.task_id = p.task_id
INNER JOIN (SELECT project_id, MAX(created_at) FROM task GROUP BY project_id) l 
            ON  l.project_id = p.project_id
            AND l.created_at = t.created_at
GROUP BY P.task_id, P.user_id
于 2012-08-25T05:27:25.747 に答える
0

最初にクエリを実行して、すべてのプロジェクトの最後のタスクを取得し、このような結果セットを取得してみてください

P1    T2
P2    T3
P3    T3

次に、プロジェクトによって元のテーブルをこのクエリの結果のテーブルと結合し、サブクエリのプロジェクトが NULL でないレコードをタスク フィルター処理し、subquery.task、originalTable.User によってカウント (*) グループを取得します。

編集

列 TASK の数字は、プロジェクト内のタスクの順序であると想定しています (この「T1」、「T2」... 値をテーブルに格納している場合は、それらを int 値に変更することを検討する必要があります)

このクエリは、すべてのプロジェクトの最後のタスクを取得します

SELECT project, 
'T' + CAST(MAX(CAST(REPLACE(task, 'T','') AS INT)) AS VARCHAR(3)) AS MaxTask
FROM Tasks
GROUP BY project

次に、このテーブルをタスクテーブルに再度結合して、ユーザーとグループを取得してカウントを取得する必要があります

SELECT mt.MaxTask, t.User, count(*) Count
FROM Tasks t LEFT JOIN (
    SELECT project, 
    'T' + CAST(MAX(CAST(REPLACE(task, 'T','') AS INT)) AS VARCHAR(3)) AS MaxTask
    FROM Tasks
    GROUP BY project
) AS mt ON t.project = mt.project AND t.task = mt.task
WHERE mt.task IS NOT NULL
GROUP BY mt.MaxTask, t.User
于 2012-08-17T02:10:19.677 に答える