查找表中的最后(第一个)实例,但不包括最近(最早)的日期

时间:2012-10-25 15:55:49

标签: sql

我有一张表反映了某个人口的每月人口普查。在该月初的一个不可预测的日子里,每个月对人口进行调查。当时存在的任何成员都包含在该月的民意调查中,任何不这样做的成员都不包括在内。

我的任务是查看任意日期范围,并确定在该时间段内添加或丢失的成员。考虑样本表:

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

在这种情况下,1月到2月期间添加了ID为“1”的成员,2月到3月期间ID 2成员丢失了。

我遇到的问题是,如果我只是轮询试图找到最新的条目,我会捕获所有被删除的成员,但也会捕获最后一个日期存在的所有成员。例如,我可以运行此查询:

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()或带有NOT EXISTS的子查询)更有效率 2.如何修复查询,以便它们只返回我想要的行,不包括第一个(最后)日期。

谢谢!

1 个答案:

答案 0 :(得分:0)

你可以这样做:

SELECT
  ID,
  Max(Date)
FROM
  tableName
WHERE
  Date BETWEEN '1/1/2010' AND '3/27/2010'
GROUP BY
  ID
having max(date) < '3/1/2010'

这会过滤掉三月份接受过调查的任何人。

相关问题