0

我有一个包含一组要执行的任务的表:

Task

    ID  Name

    1   Washing Up
    2   Hoovering
    3   Dusting

用户可以将一个或多个注释添加到注释表中。每个注释都与一个任务相关联:

Note

    ID  ID_Task     Completed(%)    Date

    11  1       25      05/07/2013 14:00
    12  1       50      05/07/2013 14:30
    13  1       75      05/07/2013 15:00
    14  3       20      05/07/2013 16:00
    15  3       60      05/07/2013 17:30

我想要一个查询,它将选择任务 ID、名称和它的完成百分比,如果没有任何注释,它应该为零。查询应返回:

    ID  Name        Completed (%)

    1   Washing Up  75
    2   Hoovering    0
    3   Dusting     60

我真的一直在为这个查询而苦苦挣扎,我读过这是一个“每组最大 n 个”类型的问题,其中有很多关于 SO 的示例,没有一个可以应用于我的案例(或者至少充分认识)。我的直觉是从在笔记表中找到每个任务的 MAX(Date) 开始:

SELECT  ID_Task,
            MAX(Date) AS Date
            FROM
            Note
            GROUP BY
            ID_Task

烦人的是,我不能只在上面的查询中添加“Complete %”,除非它包含在 GROUP 子句中。啊!我不知道如何跳过这个圈,以便以某种方式获取任务表行以及附加的列。这是我可怜的尝试,它失败了,因为它只返回带有注释的任务,然后在那里复制任务记录(每个注释一个,所以完全失败)。

SELECT  Task.ID,
    Task.Name,
    Note.Complete
    FROM
    Task        
    JOIN
    (SELECT ID_Task,
        MAX(Date) AS Date
        FROM
        Note
        GROUP BY
        ID_Task) AS InnerNote
    ON
    Task.ID = InnerNote.ID_Task
    JOIN
    Note
    ON
    Task.ID = Note.ID_Task

任何人都可以帮助我吗?

4

3 回答 3

2

如果我们假设任务只会变得更加完整,您可以使用 aleft outer join和聚合来做到这一点:

select t.ID, t.Name, coalesce(max(n.complete), 0)
from tasks t left outer join
     notes n
     on t.id = n.id_task
group by t.id, t.name

如果任务可能变得“不太完整”,那么您需要最后日期的任务。为此,您可以使用row_number()

select t.ID, t.Name, coalesce(n.complete, 0)
from tasks t left outer join
     (select n.*, row_number() over (partition by id_task order by date desc) as seqnum
      from notes n
     ) n
     on t.id = n.id_task and n.seqnum = 1;

在这种情况下,您不需要group by, 因为seqnum = 1执行相同的角色。

于 2013-07-05T13:19:25.540 回答
0
select a.ID, 
       a.Name, 
       isnull((select completed 
                 from Note 
                where ID_Task = b.ID_Task 
                  and Date = b.date),0)
from Task a 
LEFT OUTER JOIN (select ID_Task, 
                        max(date) date 
                   from Note 
               group by ID_Task) b
ON a.ID = b.ID_Task;

在此处查看演示

于 2013-07-05T13:51:31.437 回答
0

怎么样,只需按 taskid 获得已完成和分组的最大值

SELECT  t.ID_Task as ID,n.`name`,MAX(t.completed) AS completed
FROM `task` t RIGHT JOIN `note` n on (  t.ID_Task=n.ID )
 GROUP BY t. ID_Task

或者

SELECT  t.ID_Task as ID,n.`name`,
(CASE when MAX(t.completed) IS NULL THEN '0' ELSE  MAX(t.completed))AS completed
FROM `task` t RIGHT JOIN `note` n on (  t.ID_Task=n.ID )
 GROUP BY t. ID_Task
于 2013-07-05T13:22:39.953 回答