2017-09-27 3 views
1

テーブルcustomerには顧客IDとサービスIDを持つ2つのカラムがあります。したがって、複数のサービスを使用するすべての顧客は、顧客が使用する連続したサービスの最大数を見つけなければなりません。mysqlで連続した重複行を数える方法

私は、顧客が使用する最大サービスを連続して数えなければなりません。

出力:

Customerid|Serviceid|ServiceidCount 
---------------------------------- 

Nitesh|Mobile|2 
Nishant|Landline|3 
Soe|Mobile|2 
+4

SQLテーブル*順不同*セットを表します。順序を指定する列がないと、質問に意味がありません。 –

+0

注文をどのように正確に知ることができますか? – sagi

+1

...別の列(日付、ID ...)が必要です。 – etsa

答えて

0

私はあなたが順序を指定する列を持っていると仮定しましょう、idを言います。

select customer, max(rn) as serviceidcnt, 
     substring_index(group_concat(serviceid order by rn desc)) as serviceid 
from (select c.*, 
      (@rn := if(@cs = concat_ws(':', customerid, serviceid), @rn + 1, 
         if(@cs := concat_ws(':', customerid, serviceid), 1, 1) 
         ) 
      ) as rn 
     from customer c cross join 
      (select @rn := 0, @cs := '') params 
     order by c.customer, ?? 
    ) cs 
group by customer; 

??を発注するために使用されるカラムのためである:

その後、あなたは、この使用して変数を行うことができます。

注:サービスIDを取得するには、group_concat()に依存するMySQLの「ハック」を使用する必要があります。デフォルトでは、これは約1000バイトの内部バッファサイズに制限されています。これは変更することができます。

+0

私はこれを試しました。 動作しません。 –

+0

どのように "機能していない"のですか? –

0

更新バージョン

クエリを次のよう試すことができます。 mysql変数を使用して、カラムのカスタマーIDおよびのサービスIDの連続した変更をチェックします。 (あなた以外)

SELECT customerid, serviceid, MAX(R)+1 AS ServiceIdCount 
FROM (SELECT c.customerid, c.serviceid 
    , CASE WHEN @s=CONCAT(customerid,'|',serviceid) THEN @r:[email protected]+1 ELSE @r:=0 END AS R 
    , @s:=CONCAT(customerid,'|',serviceid) AS S 
    FROM customer c 
    CROSS JOIN (SELECT @r:=0, @s:='') d 
    ORDER BY id 
    ) e 
WHERE R>0 
GROUP BY customerid, serviceid; 

追加サンプルデータ:

insert into customer(customerid,serviceid) values('Mark','Mobile'); 
insert into customer(customerid,serviceid) values('Mark','Mobile'); 
insert into customer(customerid,serviceid) values('Mark','Mobile'); 
insert into customer(customerid,serviceid) values('Mark','Landline'); 
insert into customer(customerid,serviceid) values('Mark','Mobile'); 
insert into customer(customerid,serviceid) values('Mark','Mobile'); 

出力:

+------------+-----------+----------------+ 
| customerid | serviceid | ServiceIdCount | 
+------------+-----------+----------------+ 
| Mark  | Mobile |    3 | 
| Nishant | Landline |    3 | 
| Nitesh  | Mobile |    2 | 
| Soe  | Mobile |    2 | 
+------------+-----------+----------------+ 
+0

@ NiteshKatariaクエリがMAXの連続を取得するように変更されました。 – etsa

関連する問題