特定の人口の毎月の国勢調査を反映したテーブルがあります。毎月、その月の初めの予測不可能な日に、母集団がポーリングされます。その時点で存在していたメンバーはその月の投票に含まれますが、そうでないメンバーは含まれません。
私の仕事は、任意の日付範囲を調べて、その期間中に追加または削除されたメンバーを特定することです。サンプル テーブルを考えてみましょう。
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. 最初 (最後) の日付を除いて、必要な行のみを返すようにクエリを修正する方法.
ありがとう!