我有一张表格,反映了某个人口的每月人口普查。每个月在该月初的一个不可预测的日子,都会对人口进行民意调查。在那个时候存在的任何成员都包含在该月的民意调查中,任何不存在的成员都不是。
我的任务是查看任意日期范围并确定在该时间段内添加或丢失了哪些成员。考虑样本表:
ID | Date
2 | 1/3/2010
3 | 1/3/2010
1 | 2/5/2010
2 | 2/5/2010
3 | 2/5/2010
1 | 3/3/2010
3 | 3/3/2010
在这种情况下,ID 为“1”的成员在 1 月和 2 月之间添加,而 ID 为 2 的成员在 2 月和 3 月之间丢失。
我遇到的问题是,如果我只是轮询以尝试查找最新条目,我将捕获所有已删除的成员,以及最后日期存在的所有成员。例如,我可以运行这个查询:
SELECT
ID,
Max(Date)
FROM
tableName
WHERE
Date BETWEEN '1/1/2010' AND '3/27/2010'
GROUP BY
ID
这将返回:
ID | Date
1 | 3/3/2010
2 | 2/5/2010
3 | 3/3/2010
然而,我真正想要的只是:
ID | Date
2 | 2/5/2010
当然我可以手动过滤掉最后一个日期,但是由于开始和结束日期是我想概括的参数。一种方法是运行顺序查询。在第一个查询中,我会找到最后一个日期,然后在第二个查询中使用它来过滤。但是,如果我可以将此逻辑包装到单个查询中,那将真的很有帮助。
当我尝试查找成员首次添加到人口中时,我也遇到了相关问题。在这种情况下,我使用不同类型的查询:
SELECT
ID,
Date
FROM
tableName i
WHERE
Date BETWEEN '1/1/2010' AND '3/27/2010'
AND
NOT EXISTS(
SELECT
ID,
Date
FROM
tableName ii
WHERE
ii.ID=i.ID
AND
ii.Date < i.Date
AND
Date BETWEEN '1/1/2010' AND '3/27/2010'
)
这将返回:
ID | Date
1 | 2/5/2010
2 | 1/1/2010
3 | 1/1/2010
但我想要的是:
ID | Date
1 | 2/5/2010
我想知道:1.哪种方法(MAX() 或不存在的子查询)更有效,2.如何修复查询,以便它们只返回我想要的行,不包括第一个(最后一个)日期.
谢谢!