仅当较新的记录不存在时才选择记录

时间:2014-01-16 22:06:08

标签: sql sql-server

我很难在这里查看看似相对简单的查询。

基本上我为我的用户提供了一份合同表。每个用户都有多个合同。当合同到期时,它不会被标记为这样,如果用户与我们续订,则会创建一个新的活动合同记录,并在未来创建一个新的结束日期,我们将继续这样做。

我想要做的是创建一个查询,选择所有合同已过期但未与我们续订的用户。

为简单起见,这里是我的合同表的简单版本。

+------+----------+--------+
|UserID|ContractID|End Date|
+------+----------+--------+
|1     |1         |1/1/2014|
+------+----------+--------+
|2     |2         |1/1/2015|
+------+----------+--------+
|3     |3         |1/1/2014|
+------+----------+--------+
|1     |4         |1/1/2015|
+------+----------+--------+

因此,您可以看到用户1具有活动和非活动合同,用户2仅处于活动状态,而用户3仅处于非活动状态。我需要查询才能找到用户3,因为他尚未续订。

2 个答案:

答案 0 :(得分:4)

SELECT UserId
FROM Contract
GROUP BY UserId
HAVING MAX(EndDate) < GETDATE()

答案 1 :(得分:3)

您可以在NOT EXISTS子句中使用Where来查看用户是否没有结束日期大于现在的合同。

SELECT
    *
FROM Contract c
WHERE EndDate < GetDate()
    AND NOT EXISTS
    (
         SELECT
             1
         FROM Contract ic
         WHERE ic.UserID = c.UserID
             AND ic.EndDate > GetDate()
    )