![](/img/trans.png)
[英]SELECT count from table where column is CONNECT but other rows with related other column does not have a certain value
[英]Select rows in one table, adding column where MAX(Date) of rows in other, related table
我有一個包含要執行的一組任務的表:
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(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
有人可以幫我嗎?
如果我們假設任務變得更加完整,您可以使用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
執行相同的角色。
怎么樣才能獲得完成和分組的最大值
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
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.