-2

私は組織のサポーターのデータをクリーンアップする任務を負っています。いくつかの SQL クエリ コーディングには問題はありませんが、もう少し複雑な問題に遭遇しました (私にとっては!)。

タスクは、サポーターをアクティブまたは失効としてマークすることです。

開始日を確認することでこれを行うことができます。その日から 2 年以内であれば、アクティブとマークし、それを超えるものはクローズとマークすることができます。悲しいことに、これほど簡単なことはありません。サポーターは、組織との関わり方によって、さらにレベルアップする可能性があります。

クエリで実行する必要があるのは、追加のサポーター コードがあるかどうかを確認することです。たとえば、2 つのレベルでアクティブにすることはできず、次のレベルにあるかどうかを確認するクエリが必要です。その場合、上記のルールを満たしているかどうかに関係なく、前のコードを破棄します。彼らは最大5レベルまで上昇することができます。

これが理にかなっていることを願っています。データはこんな感じ。

Member ID | Category | Start Date | End Date
123456    | LEG1     | 01/12/2012 |
654321    | LEG1     | 01/01/2009 |   
421124    | LEG1     | 01/05/2011 |   
421124    | LEG2     | 02/04/2011 | 31/12/2012
421124    | LEG3     | 02/04/2011 | 31/12/2012
421124    | LEG4     | 31/12/2012 |   
567888    | LEG2     | 14/03/2012 |   
567888    | LEG3     | 22/08/2012 |   
119119    | LEG2     | 01/01/2011 | 31/12/2012

どんなアドバイスもありがたく受け取った。

4

1 に答える 1

0

次のようにしてみてください。

DECLARE @t TABLE([Member ID] INT, Category VARCHAR(100), [Start Date] DATE, [End Date] DATE)
INSERT @t 
SELECT a,b,CONVERT(DATE, c, 104) c, CONVERT(DATE, d, 104)
FROM (VALUES
(123456 ,'LEG1', '01/12/2012', NULL),
(654321 ,'LEG1', '01/01/2009', NULL),
(421124 ,'LEG1', '01/05/2011', NULL),
(421124 ,'LEG2', '02/04/2011', '31/12/2012'),
(421124 ,'LEG3', '02/04/2011', '31/12/2012'),
(421124 ,'LEG4', '31/12/2012', NULL),
(567888 ,'LEG2', '14/03/2012', NULL),
(567888 ,'LEG3', '22/08/2012', NULL),
(119119 ,'LEG2', '01/01/2011', '31/12/2012')
-- I added these rows to sample data to show how borderline cases are treated
(100000 ,'LEG1', '17/02/2011', NULL),
(100001 ,'LEG1', '18/02/2011', NULL),
(100002 ,'LEG1', '19/02/2011', NULL)
) tbl(a,b,c,d)

SELECT  *
        , CASE WHEN 
            ROW_NUMBER() OVER (PARTITION BY [Member ID] ORDER BY Category DESC) > 1
            OR 
            [Start Date] < DATEADD(YEAR, -2, CAST(GETDATE() AS DATE))
          THEN 'lapsed' 
          ELSE 'active' 
          END [Status]
FROM    @t
ORDER BY
        [Member ID]

両方の条件をチェックし、ROW_NUMBER()最高の達成カテゴリではない行をアクティブとしてマークできないようにし、今日の日付から 2 年を引いた日付とのDATETIME比較で2 番目の条件を処理します。[Start Date]これらの条件のいずれかが満たされた場合、レコードはアクティブとしてマークされません。

于 2013-02-18T11:07:21.677 に答える