sql >> Databáze >  >> RDS >> Mysql

Spočítejte počet řádků, které nejsou od sebe vzdáleny více než 10 sekund

Začnu touto tabulkou. Použiji běžná časová razítka, abychom snadno viděli, co se děje.

180.2.79.3   2011-01-01 08:00:00
180.2.79.3   2011-01-01 08:00:09
180.2.79.3   2011-01-01 08:00:20
180.2.79.3   2011-01-01 08:00:23
180.2.79.3   2011-01-01 08:00:25
180.2.79.3   2011-01-01 08:00:40
180.2.79.4   2011-01-01 08:00:00
180.2.79.4   2011-01-01 08:00:13
180.2.79.4   2011-01-01 08:00:23
180.2.79.4   2011-01-01 08:00:25
180.2.79.4   2011-01-01 08:00:27
180.2.79.4   2011-01-01 08:00:29
180.2.79.4   2011-01-01 08:00:50

Pokud vám dobře rozumím, chcete je počítat takto.

180.2.79.3   3
180.2.79.4   3

Můžete to udělat pro každou ip_address výběrem maximálního časového razítka, které je obojí

  • větší než časové razítko aktuálního řádku a
  • menší nebo rovno o 10 sekund větší než časové razítko aktuálního řádku.

Shrnutí těchto dvou kritérií dohromady zavede několik nulových bodů, které se ukazují jako skutečně užitečné.

select ip_address, 
       t_s.time_stamp, 
       (select max(t.time_stamp) 
        from t_s t 
        where t.ip_address = t_s.ip_address 
          and t.time_stamp > t_s.time_stamp
          and t.time_stamp - t_s.time_stamp <= interval '10' second) next_page
from t_s 
group by ip_address, t_s.time_stamp
order by ip_address, t_s.time_stamp;

ip_address   time_stamp            next_page
180.2.79.3   2011-01-01 08:00:00   2011-01-01 08:00:09
180.2.79.3   2011-01-01 08:00:09   <null>
180.2.79.3   2011-01-01 08:00:20   2011-01-01 08:00:25
180.2.79.3   2011-01-01 08:00:23   2011-01-01 08:00:25
180.2.79.3   2011-01-01 08:00:25   <null>
180.2.79.3   2011-01-01 08:00:40   <null>
180.2.79.4   2011-01-01 08:00:00   <null>
180.2.79.4   2011-01-01 08:00:13   2011-01-01 08:00:23
180.2.79.4   2011-01-01 08:00:23   2011-01-01 08:00:29
180.2.79.4   2011-01-01 08:00:25   2011-01-01 08:00:29
180.2.79.4   2011-01-01 08:00:27   2011-01-01 08:00:29
180.2.79.4   2011-01-01 08:00:29   <null>
180.2.79.4   2011-01-01 08:00:50   <null>

Časové razítko, které označuje konec návštěvy, má pro svou vlastní další_stránku hodnotu null. Je to proto, že žádné časové razítko není pro daný řádek menší nebo rovné časovému razítku + 10 sekund.

Abych získal počet, pravděpodobně bych vytvořil pohled a spočítal nuly.

select ip_address, count(*)
from t_s_visits 
where next_page is null
group by ip_address

180.2.79.3   3
180.2.79.4   3


  1. doctrine2 - Jak zlepšit účinnost splachování?

  2. Získejte čas a čas pomocí T-SQL?

  3. vyberte z jedné tabulky, počítejte z jiné, kde je id propojeno

  4. Počítat duplicitní záznamy v tabulce Mysql?