これにより、同じタイプのアクションが2つ以上連続しているすべての顧客が選択されます。
WITH rows AS
(
SELECT customer, action,
ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
FROM mytable
)
SELECT DISTINCT customer
FROM rows rp
WHERE EXISTS
(
SELECT NULL
FROM rows rl
WHERE rl.customer = rp.customer
AND rl.rn = rp.rn + 1
AND rl.action = rp.action
)
アクション2
だけのより効率的なクエリは次のとおりです :
WITH rows AS
(
SELECT customer, ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
FROM mytable
WHERE action = 2
)
SELECT DISTINCT customer
FROM rows rp
WHERE EXISTS
(
SELECT NULL
FROM rows rl
WHERE rl.customer = rp.customer
AND rl.rn = rp.rn + 1
)
更新2:
中断のない範囲を選択するには:
WITH rows AS
(
SELECT customer, action, lastlogin
ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
ROW_NUMBER() OVER (PARTITION BY customer, action ORDER BY lastlogin) AS series
FROM mytable
)
SELECT DISTINCT customer
FROM (
SELECT customer
FROM rows rp
WHERE action
GROUP BY
customer, actioncode, series - rn
HAVING
DETEDIFF(day, MIN(lastlogin), MAX(lastlogin)) >= 14
) q
このクエリは2つのシリーズを計算します。1つは連続したORDER BY lastlogin
を返します 、2番目のパーティションはaction
で分割されます さらに:
action logindate rn series diff = rn - series
1 Jan 01 1 1 0
1 Jan 02 2 2 0
2 Jan 03 3 1 2
2 Jan 04 4 2 2
1 Jan 05 5 3 2
1 Jan 06 6 4 2
2つのスキームの違いが同じである限り、シリーズは中断されません。中断するたびにシリーズが中断されます。
これは、(action, diff
の組み合わせを意味します )中断されないグループを定義します。
action, diff
でグループ化できます 、MAX
を見つけます およびMIN
グループ内でフィルタリングします。
14
を選択する必要がある場合 14
ではなく行 連続した日は、COUNT(*)
でフィルタリングするだけです DATEDIFF
の代わりに 。