sql >> Database teknologi >  >> RDS >> Sqlserver

Find poster med 3 eller flere på hinanden følgende poster med samme værdi

Du kan bruge et trick til at opregne "kontante" transaktioner. Dette trick er en forskel på rækkenumre, og det er meget nyttigt:

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;

Dette returnerer kunderne og startdatoen. Hvis du ønsker at returnere de faktiske transaktioner, kan du bruge et ekstra niveau af vinduesfunktioner:

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. Hvordan omdannes hashed og saltet adgangskode?

  2. Returner kun numeriske værdier i MySQL

  3. Sådan håndteres BOB-undtagelser

  4. Kan sammenføjninger mellem visninger og tabel skade ydeevnen?