2017-04-19 21 views
0

で正しくラグ機能を使用することができません:私はこのような複数のテーブルからテーブルを作成したSQL

Week | Cid | CustId | L1 
10 | 1 | 1 | 2 
10 | 2 | 1 | 2 
10 | 5 | 1 | 2 
10 | 4 | 1 | 1 
10 | 3 | 2 | 1 
4 | 6 | 1 | 2 
4 | 7 | 1 | 2 

私はのように出力したい:

だから、
Repeat 
0 
1 
1 
0 
0 
0 
1 

は、基本的に私が何をしたいです毎週、同じL1で人(クスティド)が再び入ると、列Repeatの値は1になります。そうでなければ0(行2のように3、custid 1にL1 = 2再び、列 "繰り返し"で1を取得しますが、行4では、custid 1にはL1 = 1が付いていますので、 tは値を得る)。

ところで、テーブルは注文されていません(私が示したように)。

次のように私はそれをやろうとしている:

select t.*, 
lag(0, 1, 0) over (partition by week, custid, L1 order by cid) as repeat 
from 
table; 

をしかし、これは出力を与えていないと、空の結果を与えています。

答えて

0

私はあなたがcaseが必要だと思うが、私はこのためrow_number()を使用します。

select t.*, 
     (case when row_number() over (partition by week, custid, l1 order by cid) = 1 
      then 0 else 1 
     end) as repeat 
from table; 
0

これはまた、ウィンドウ関数なしではなく、自己の参加、次のようにすることにより計算することができます。

SELECT a.week, a.cid, a.custid, a.l1, 
     CASE WHEN b IS NULL THEN 1 ELSE 0 END AS repeat 
FROM mytable a NATURAL LEFT JOIN 
    (SELECT week, min(cid) AS cid, custid, l1 FROM mytable 
     GROUP BY week,custid,l1) b 
ORDER BY week DESC, custid, l1 DESC, cid; 
0

これは、分析関数としてカウント(*)を使用するだけで簡単に実行できます。大文字小文字の表現や自己結合は必要ありません。クエリは、分析関数をサポートするデータベース間でも移植可能です:

SELECT cust.*, least(count(*) 
     OVER (PARTITION BY Week, CustId, L1 ORDER BY Cid 
     ROWS UNBOUNDED PRECEDING) - 1, 1) repeat 
FROM cust ORDER BY Week DESC, custId, L1 DESC; 

(最後の行が繰り返し行である)次の出力で、あなたのデータ結果のクエリを実行:

Oracle 11gの上でテストさ
Week | Cid | CustId | L1 | repeat 
10 1 1 2 0 
10 2 1 2 1 
10 5 1 2 1 
10 4 1 1 0 
10 3 2 1 0 
4 6 1 2 0 
4 7 1 2 1 

PostgreSQL 9.4などです。 2番目のORDER BYはオプションです。詳細は、Oracle Language Reference, Analytic Functionsを参照してください。

関連する問題