我的每個客戶都可以有很多待辦事項,每個待辦事項都有到期日期。「簡單」SQL查詢
按照每個文件的截止日期查找下一個未完成待辦事項的查詢是什麼?如果客戶有多個待辦事項,則具有最低ID的那個是正確的。
假設下面的最小模式:
clients (id, name)
todos (id, client_id, description, timestamp_due, timestamp_completed)
謝謝。
我的每個客戶都可以有很多待辦事項,每個待辦事項都有到期日期。「簡單」SQL查詢
按照每個文件的截止日期查找下一個未完成待辦事項的查詢是什麼?如果客戶有多個待辦事項,則具有最低ID的那個是正確的。
假設下面的最小模式:
clients (id, name)
todos (id, client_id, description, timestamp_due, timestamp_completed)
謝謝。
我沒有測試過這個呢,所以你可能需要調整它:
SELECT
TD1.client_id,
TD1.id,
TD1.description,
TD1.timestamp_due
FROM
Todos TD1
LEFT OUTER JOIN Todos TD2 ON
TD2.client_id = TD1.client_id AND
TD2.timestamp_completed IS NULL AND
(
TD2.timestamp_due < TD1.timestamp_due OR
(TD2.timestamp_due = TD1.timestamp_due AND TD2.id < TD1.id)
)
WHERE
TD2.id IS NULL
而不是試圖梳理和彙總,你基本上回答這個問題,「是否有任何在這之前會有其他的待辦事項?「 (根據您對「之前」的定義)。如果不是,那麼這就是你想要的。
這應該在大多數SQL平臺上都有效。
下面應該讓你關閉,首先獲得分鐘時間爲每個客戶端,然後查找客戶端/ TODO信息
SELECT
C.Id,
C.Name,
T.Id
T.Description,
T.timestamp_due
FROM
{
SELECT
client_id,
MIN(timestamp_due) AS "DueDate"
FROM todos
WHERE timestamp_completed IS NULL
GROUP BY ClientId
} AS MinValues
INNER JOIN Clients C
ON (MinValues.client_id = C.Id)
INNER JOIN todos T
ON (MinValues.client_id = T.client_id
AND MinValues.DueDate = T.timestamp_due)
ORDER BY C.Name
注:書面假設SQL服務器
SELECT c.name, MIN(t.id)
FROM clients c, todos t
WHERE c.id = t.client_id AND t.timestamp_complete IS NULL
GROUP BY c.id
HAVING t.timestamp_due <= MIN(t.timestamp_due)
避免一個子查詢,相關或其他方式,但引入了一堆並不好得多的聚合操作。
使用sqlite語法,但沒有什麼特別的。 – 2008-10-29 14:10:30
這個問題是經典的每個組別的挑選者。它每天發佈兩次。
SELECT *
FROM todos t
WHERE t.timestamp_completed is null
and
(
SELECT top 1 t2.id
FROM todos t2
WHERE t.client_id = t2.client_id
and t2.timestamp_completed is null
--there is no earlier record
and
(t.timestamp_due > t2.timestamp_due
or (t.timestamp_due = t2.timestamp_due and t.id > t2.id)
)
) is null
一些Jet SQL,我意識到這是不太可能的問題是使用Jet,但讀者可能會。
SELECT c.name, t.description, t.timestamp_due
FROM (clients c
INNER JOIN
(SELECT t.client_id, Min(t.id) AS MinOfid
FROM todos t
WHERE t.timestamp_completed Is Null
GROUP BY t.client_id) AS tm
ON c.id = tm.client_id)
INNER JOIN todos t ON tm.MinOfid = t.id
你還沒有說你正在使用哪個平臺 - 不同的平臺有不同的語法。 – Ross 2008-10-29 14:03:59
我正在使用SQL Server,但我故意遺漏了它。我更喜歡直接的SQL解決方案。 – 2008-10-29 15:07:43