2017-06-23 12 views
0

データ:SQL Serverの:トップ句の条件チェック

UserId  EffectiveDate    Plan 
    162  2015-07-01 00:00:00.000  LT60 
    162  2015-10-16 00:00:00.000  LT60 
    162  2016-05-02 00:00:00.000  LT60 
    15  2015-07-01 00:00:00.000  LT120 
    15  2016-06-01 00:00:00.000  LT50 

問題:

ケース1:計画が変更された場合:最新の行を選択してください

例:LT120、LT50からユーザーID 15プランの変更のためにだからLT50行が

にケース2を選択されます:計画が変更されない場合は、次の最も初期の行を選択してください

例:ユーザID 162の場合、プランは同じLT60なので、最初の行2015-07-01を選択する必要があります

私はTop 1関数を使用しようとしましたが、プランが変更された場合は失敗します。

+0

計画が複数回変更する場合はどう? –

+0

常に最新の計画を選んでください.. @ GordonLinoff – user3440798

答えて

1

変更があるたびに基本的に最初の行が必要なようです。基本的な考え方は次のとおりです。

select t.* 
from (select t.*, 
      min(t.plan) over (partition by t.userid) as min_plan, 
      max(t.plan) over (partition by t.userid) as max_plan, 
      row_number() over (partition by t.userid order by t.effectivedate) as seqnum_asc, 
      row_number() over (partition by t.userid order by t.effectivedate desc) as seqnum_desc 
     from t 
    ) t 
where (min_plan = max_plan and seqnum_asc = 1) or 
     (min_plan <> max_plan and seqnum_desc = 1); 
+0

私は私の答えで少し遅れたようです:-)あなたのseqnumエイリアス名が好きです。 –

0

あなたは以下のように数とROW_NUMBERを使用して試すことができます:

Select UserId, EffectiveDate, [Plan] from (
    Select *, RowNum = Row_number() over(partition by userid order by EffectiveDate), 
     CntPlan = count([plan]) over(partition by userid, [Plan]), 
     CntUser = count([Plan]) over(partition by userid), 
     RowNumPlan = Row_number() over(partition by userid order by effectiveDate desc) 
     from #Plan 
) a 
where (a.CntPlan = a.CntUser and rownum = 1) 
    or (a.CntPlan <> a.CntUser and RowNumPlan = 1)