我有一个包含要执行的任务的表:
Task
ID Name
1 Washing Up
2 Hoovering
3 Dusting
用户可以将一个或多个Notes添加到Note表中。每个笔记都与一个任务相关联:
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(日期):
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
有人可以帮我吗?
答案 0 :(得分:2)
如果我们假设任务变得更加完整,您可以使用left 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
执行相同的角色。
答案 1 :(得分: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
OR
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
答案 2 :(得分: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;