SQL Server 2005を使用しているので、 ROW_NUMBER
をご利用ください。私は何かのように始めることを提案するでしょう
SELECT MemberID, StartDate, EndDate,
ROW_NUMBER() OVER(PARTITION BY MemberID ORDER BY s.StartDate ASC)
AS SubscriptionSequence
FROM Subscriptions s
INNER JOIN Members m ON s.MemberID = m.ID
INNER JOIN SubscriptionTypes st ON s.SubTypeID = st.ID
WHERE @PeriodStart <= s.StartDate
AND m.Type = 'Student'
これは、 @PeriodStart
以降で開始するサブスクリプションを持つ各 Student
メンバー、 Every every サブスクリプションの行、日付の順序を示すシーケンス番号。
だから誰かが3ヶ月、1ヶ月かかると、あなたは
TheMemberId Jul 1 2011 Sep 30 2011 1
TheMemberId Oct 1 2011 Oct 31 2011 2
さらにクエリの洗練化またはアプリケーションコードのいずれかで、必要に応じてシーケンス番号を使用できます。
解説:
概念的な動作は次のとおりです。
-
WHERE
の条件を満たす(つまり、特定の日付以降に行われた)すべての購入を特定する
- メンバー別にグループ化する(
PARTITION BY
)
- 各メンバーのグループ内で、日付順に購入を注文し、そのグループ内の位置をメモします(これは
ROW_NUMBER()OVER(... ORDER BY)
です)。
- 購入ごとに行を発行します。列の1つは、注文されたメンバーごとのグループ内の位置です(これは
SubscriptionSequence
)
フォローアップ購入を行ったメンバーのみに興味がある場合は、
SELECT MemberID, StartDate, EndDate,
ROW_NUMBER() OVER(PARTITION BY MemberID ORDER BY s.StartDate ASC)
AS SubscriptionSequence,
(SELECT COUNT(*) FROM Subscriptions ss
WHERE @PeriodStart <= ss.StartDate
AND ss.MemberID = m.ID) AS SubscriptionCount
FROM Subscriptions s
INNER JOIN Members m ON s.MemberID = m.ID
INNER JOIN SubscriptionTypes st ON s.SubTypeID = st.ID
WHERE @PeriodStart <= s.StartDate
AND m.Type = 'Student'
AND SubscriptionCount >= 2
私は相関サブクエリを使用して、各行にその行で参照されているメンバが行った適格なサブスクリプションの数をカウントする列を含めました。
メンバーID 234および567の出力例:
234 Jul 1 2011 Sep 30 2011 1 2
234 Oct 1 2011 Oct 31 2011 2 2
567 Jul 1 2011 Sep 30 2011 1 3
567 Oct 1 2011 Oct 31 2011 2 3
567 Dec 1 2011 Dec 31 2011 3 3
ここでメンバー234は2つの適格なサブスクリプションを持っていましたが、メンバー567は3でした。 WHERE
節の最後の項のために、1つの適格サブスクリプションしか持たないメンバーはこの2番目のクエリーの出力に表示されません。