sql >> Database >  >> RDS >> Sqlserver

Vind records met 3 of meer opeenvolgende records met dezelfde waarde

U kunt een truc gebruiken om de "contante" transacties op te sommen. Deze truc is een verschil van rijnummers en het is erg handig:

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;

Dit retourneert de klanten en de startdatum. Als u de werkelijke transacties wilt retourneren, kunt u een extra niveau van vensterfuncties gebruiken:

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;


  1. Verschil tussen mysql, mysqladmin, mysqld

  2. Hoe current_timestamp() werkt in PostgreSQL

  3. Transactie kan geen parallelle opdrachten verwerken via Task.WhenAll

  4. Globale query-time-out in MySQL 5.6