Mysql
 sql >> база данни >  >> RDS >> Mysql

Преброяване на активните потребители въз основа на влизанията през последните 90 дни

Проблеми като този са по-лесни за решаване, ако имате календарна таблица с всички дати, от които се нуждаете. Ако нямате такава таблица, можете да я създадете със заявка като тази:

създайте таблица `календар` ( `date` DATE NOT NULL, PRIMARY KEY (`date`)) изберете DATE_ADD('1900-01-01',INTERVAL t4.c*10000 + t3.c*1000 + t2.c*100 + t1.c*10 + t0.c DAY) като `дата` от (изберете 0 c съюз всички изберете 1 съюз всички изберете 2 съюз всички изберете 3 съюз всички изберете 4 съюз всички изберете 5 съюз всички изберете 6 съюз всички изберете 7 съюз всички изберете 8 съюз всички изберете 9) t0, (изберете 0 c съюз всички изберете 1 съюз всички изберете 2 съюз всички изберете 3 съюз всички изберете 4 съюз всички изберете 5 съюз всички изберете 6 съюз всички изберете 7 съюз всички изберете 8 съюз всички изберете 9) t1, (изберете 0 c съюз всички изберете 1 съюз всички изберете 2 съюз всички изберете 3 съюз всички изберете 4 съюз всички изберете 5 съюз всички изберете 6 съюз всички изберете 7 съюз всички изберете 8 съюз всички изберете 9) t2, (изберете 0 c съюз всички изберете 1 съюз всички изберете 2 съюз всички изберете 3 съюз всички изберете 4 съюз всички изберете 5 съюз всички изберете 6 съюз всички изберете 7 съюз всички изберете 8 съюз всички изберете 9) t3, (изберете 0 c съюз всички избрани 1 обединение всички изберете 2 обединение всички изберете 3 обединете всички изберете 4 обединете всички изберете 5 обединете всички изберете 6 обединете всички изберете 7 обединете всички изберете 8 обединете всички изберете 9) t4 

Това ще създаде таблица с дати от 1900-01-01 до 2173-10-15 (100K дни) и ще консумира само около 2,5 MB. Можете да го настроите според вашите нужди.

С помощта на календарната таблица можете да получите тримесечни диапазони:

изберете DATE_FORMAT(date_sub(c.date, INTERVAL 1 ден), '%Y-%m') като месец, date_sub(c.date, INTERVAL 3 месеца) като first_day, date_sub(c.date, ИНТЕРВАЛ 1 ден) като last_dayот календар cкъдето ден(c.date) =1 и c.date между '2015-02-01' и '2015-09-01' 

Резултат:

<предварителен код>| месец | първи_ден | последен_ден || 2015-01 | 01.11.2014 | 2015-01-31 || 2015-02 | 01.12.2014 | 2015-02-28 || 2015-03 | 01.01.2015 | 2015-03-31 || 2015-04 | 01.02.2015 | 2015-04-30 || 2015-05 | 01.03.2015 | 2015-05-31 || 2015-06 | 01.04.2015 | 2015-06-30 || 2015-07 | 01.05.2015 | 2015-07-31 || 2015-08 | 01.06.2015 | 2015-08-31 |

Коригирайте го, ако наистина искате да използвате нещо като интервали от 90 дни.

Сега е просто ляво съединение с таблицата за влизане, за да получите това, което искате:

изберете i.month като `Дата`, count(distinct l.user_id) като `Активни потребители`от ( изберете date_format(date_sub(c.date, интервал 1 ден), '%Y-%m' ) като месец, date_sub(c.date, интервал 3 месеца) като first_day, date_sub(c.date, интервал 1 ден) като last_day от календар c, където day(c.date) =1 и c.date между '2015-02 -01' и '2015-09-01') ileft се присъединява към login_table l на l.login_date между i.first_day и i.last_daygroup от i.month 

http://sqlfiddle.com/#!9/d1bb0/3



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ADO и msqli връзките са много бавни

  2. Извикване на MySQL Съхранена процедура на PHP

  3. Кога да извикам bind_param, ако използвам MySQLi подготвени оператори в цикъл?

  4. в PHP как да премахнете кода на емоджи?

  5. Комитирайте данни в mysql контейнер