sql >> Database teknologi >  >> RDS >> Mysql

Tæl antallet af på hinanden følgende besøg

Jeg gik glip af mysql-tagget og skrev denne løsning. Dette virker desværre ikke i MySQL, da det ikke understøtter vinduesfunktioner .

Jeg poster det alligevel, da jeg har lagt nogle kræfter i det. Testet med PostgreSQL. Ville fungere på samme måde med Oracle eller SQL Server (eller enhver anden anstændig RDBMS, der understøtter vinduesfunktioner).

Test opsætning

CREATE TEMP TABLE v(id int, visit date);
INSERT INTO v VALUES
 (444631, '2011-11-07')
,(444631, '2011-11-06')
,(444631, '2011-11-05')
,(444631, '2011-11-04')
,(444631, '2011-11-02')
,(444631, '2011-11-01')
,(444632, '2011-12-02')
,(444632, '2011-12-03')
,(444632, '2011-12-05');
 

Simpel version

-- add 1 to "difference" to get number of days of the longest period SELECT id, max(dur) + 1 as max_consecutive_days FROM ( -- calculate date difference of min and max in the group SELECT id, grp, max(visit) - min(visit) as dur FROM ( -- consecutive days end up in a group SELECT *, sum(step) OVER (ORDER BY id, rn) AS grp FROM ( -- step up at the start of a new group of days SELECT id ,row_number() OVER w AS rn ,visit ,CASE WHEN COALESCE(visit - lag(visit) OVER w, 1) = 1 THEN 0 ELSE 1 END AS step FROM v WINDOW w AS (PARTITION BY id ORDER BY visit) ORDER BY 1,2 ) x ) y GROUP BY 1,2 ) z GROUP BY 1 ORDER BY 1 LIMIT 1;

Output:

id | max_consecutive_days --------+---------------------- 444631 | 4

Hurtigere/kortere

Jeg fandt senere en endnu bedre måde. grp tallene er ikke kontinuerlige (men konstant stigende). Det er ligegyldigt, da det kun er et middel til et mål:

SELECT id, max(dur) + 1 AS max_consecutive_days FROM ( SELECT id, grp, max(visit) - min(visit) AS dur FROM ( -- subtract an integer representing the number of day from the row_number() -- creates a "group number" (grp) for consecutive days SELECT id ,EXTRACT(epoch from visit)::int / 86400 - row_number() OVER (PARTITION BY id ORDER BY visit) AS grp ,visit FROM v ORDER BY 1,2 ) x GROUP BY 1,2 ) y GROUP BY 1 ORDER BY 1 LIMIT 1;

SQL violin for begge.

Mere



  1. Opdatering af databaserækker uden at låse tabellen i PostgreSQL 9.2

  2. Send fil med postbud til Laravel API

  3. Få forrige og næste række fra rækker valgt med (WHERE) betingelser

  4. Hvordan opretter jeg forbindelse til PostgreSQL uden at angive et databasenavn?