1

特定の人口の毎月の国勢調査を反映したテーブルがあります。毎月、その月の初めの予測不可能な日に、​​母集団がポーリングされます。その時点で存在していたメンバーはその月の投票に含まれますが、そうでないメンバーは含まれません。

私の仕事は、任意の日付範囲を調べて、その期間中に追加または削除されたメンバーを特定することです。サンプル テーブルを考えてみましょう。

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

もちろん、最後の日付を手動で除外することもできますが、開始日と終了日はパラメーターであるため、一般化したいと考えています。1 つの方法は、シーケンシャル クエリを実行することです。最初のクエリで最後の日付を見つけ、それを使用して 2 番目のクエリでフィルター処理します。ただし、このロジックを単一のクエリにラップできれば、非常に役立ちます。

メンバーが最初に人口に追加された時期を見つけようとすると、関連する問題も発生します。その場合、別のタイプのクエリを使用しています。

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. 最初 (最後) の日付を除いて、必要な行のみを返すようにクエリを修正する方法.

ありがとう!

4

1 に答える 1

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'

これにより、3 月に投票された人は除外されます。

于 2012-10-25T16:14:33.913 に答える