Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Rechercher des enregistrements avec 3 enregistrements consécutifs ou plus avec la même valeur

Vous pouvez utiliser une astuce pour énumérer les transactions "cash". Cette astuce est une différence de numéros de lignes et elle est très utile :

select t.*
from (select t.*, count(*) over (partition by grp, customerid, transtype) as cnt
      from (select t.*,
                   (row_number() over (partition by customerid order by date) -
                    row_number() over (partition by customerid, transtype order by date)
                   ) as grp
            from t
           ) t
      where transtype = 'cash'
     ) t
where cnt >= 3;

Cela renvoie les clients et la date de début. Si vous souhaitez retourner les transactions réelles, vous pouvez utiliser un niveau supplémentaire de fonctions de fenêtre :

select customerid, min(date) as start_date, sum(value) as sumvalue
from (select t.*,
             (row_number() over (partition by customerid order by date) -
              row_number() over (partition by customerid, transtype order by date)
             ) as grp
      from t
     ) t
where transtype = 'cash'
group by grp, transtype, customerid
having count(*) >= 3;