我的每个客户都可以拥有许多待办事项,每个待办事项都有截止日期。
在每个文件的截止日期之前发现下一个撤消的待办事项的查询是什么?如果客户端有多个待办事项,那么id最低的那个就是正确的。
假设以下最小模式:
clients (id, name)
todos (id, client_id, description, timestamp_due, timestamp_completed)
谢谢。
答案 0 :(得分:3)
这个问题是每个群组的经典 选择胜利者 。它每天发布两次。
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
答案 1 :(得分:3)
我还没有测试过,所以你可能需要调整它:
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平台上都有效。
答案 2 :(得分:2)
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)
避免使用子查询,相关或其他方面,但引入了一堆不太好的聚合操作。
答案 3 :(得分:0)
一些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
答案 4 :(得分:-1)
以下内容应该让您关闭,首先获取每个客户端的最短时间,然后查找客户端/待办事项信息
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 Server