“简单”SQL查询

时间:2008-10-29 13:55:01

标签: sql sql-server

我的每个客户都可以拥有许多待办事项,每个待办事项都有截止日期。

在每个文件的截止日期之前发现下一个撤消的待办事项的查询是什么?如果客户端有多个待办事项,那么id最低的那个就是正确的。

假设以下最小模式:

clients (id, name)

todos (id, client_id, description, timestamp_due, timestamp_completed)

谢谢。

5 个答案:

答案 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