2016-03-29 17 views
0

SQLを使用して元のテーブルから修正されたテーブルを取得するにはどうすればよいですか?基本的に、私がしたいのは、顧客データの行を日付に基づいて比較することです。 1か月で15日以内に商品を購入したお客様は、1回の購入とみなされます。例えば、顧客Paolo Arcottiの場合、彼は15日以内に3回の購入を行ったが、最初の購入のみが考慮され、1回の購入とみなされる。顧客Hanna Mossの場合、これは2回の購入とみなされます。要するに、1月1日〜1月15日の購入を1回の購入とし、16〜30回の購入を別の購入として分類したいと思います。SQL - テーブル内の日付の比較

Original Table vs Revised Table

+0

使用しているデータベースとのあなたの質問にタグを付けてください。 –

+0

何を試しましたか?また、どのデータベース技術を使用していますか? – istovatis

答えて

0

データベースサポート日付関数が、各データベースが異なっています。次のアプローチは、日付の日、月、年のためにnot existsと関数を使用しています。

select t.* 
from original as t 
where not exists (select 1 
        from original as t2 
        where t2.customer = t.customer and 
         datepart("yyyy", t2.date) = datepart("yyyy", t.date) and 
         datepart("m", t2.date) = datepart("m", t.date) and 
         t2.date < t.date and 
         ((datepart("d", t2.date) <= 15 and datepart("d", t.date) <= 15) or 
         (datepart("d", t2.date) > 15 and datepart("d", t.date) > 15) 
         ) 
       ); 
+0

上記の結果から重複をさらに削除するにはどうすればよいですか?上記のコードを使用すると、小さな間違いがありました。たとえば、同じ顧客が同じ日に3回の購入を行った場合、スクリプトは、8行目〜8行目のために1の代わりに3つの購入を計算します。私はt2.date <= t.dateを試みましたが、これは修正されていないようです。 – saturday

+0

@saturday。 。 。各行の一意の識別子は、そのような複製を削除するのに役立ちます。サンプルデータと希望の結果で別の質問をしますか? –

0
;with cte as 
(
select *,DATEPART(d,orderdate) as dayofmonth1,row_number() over(partition by customer order by customer,orderdate) as rn from #test 
where DATEPART(d,orderdate)<=15 
) 
, cte1 as 
(
select *,DATEPART(d,orderdate) as dayofmonth1,row_number() over(partition by customer order by customer,orderdate)as rn from #test 
where DATEPART(d,orderdate)>15 
) 
select *from cte where rn=1 
union select *from cte1 where rn=1