Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Đếm số người dùng đang hoạt động dựa trên thông tin đăng nhập trong 90 ngày qua

Những vấn đề như thế này sẽ dễ giải quyết hơn, nếu bạn có một bảng lịch với tất cả các ngày bạn cần. Nếu bạn không có một bảng như vậy, bạn có thể tạo nó bằng một truy vấn như sau:

create table `calendar` (
    `date` DATE NOT NULL,
    PRIMARY KEY (`date`)
)  
    select DATE_ADD('1900-01-01',INTERVAL t4.c*10000 + t3.c*1000 + t2.c*100 + t1.c*10 + t0.c DAY) as `date`
    from 
    (select 0 c union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t0,
    (select 0 c union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t1,
    (select 0 c union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
    (select 0 c union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3,
    (select 0 c union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4

Điều đó sẽ tạo một bảng có ngày từ 1900-01-01 đến 2173-10-15 (100K ngày) và chỉ tiêu thụ khoảng 2,5 MB. Bạn có thể điều chỉnh nó theo nhu cầu của bạn.

Sử dụng bảng caledar, bạn có thể nhận được phạm vi ba tháng:

select 
    DATE_FORMAT(date_sub(c.date, INTERVAL 1 day), '%Y-%m') as month,
    date_sub(c.date, INTERVAL 3 month) as first_day,
    date_sub(c.date, INTERVAL 1 day)   as last_day
from calendar c
where day(c.date) = 1
  and c.date between '2015-02-01' and '2015-09-01'

Kết quả:

| month   | first_day  | last_day   |
| 2015-01 | 2014-11-01 | 2015-01-31 |
| 2015-02 | 2014-12-01 | 2015-02-28 |
| 2015-03 | 2015-01-01 | 2015-03-31 |
| 2015-04 | 2015-02-01 | 2015-04-30 |
| 2015-05 | 2015-03-01 | 2015-05-31 |
| 2015-06 | 2015-04-01 | 2015-06-30 |
| 2015-07 | 2015-05-01 | 2015-07-31 |
| 2015-08 | 2015-06-01 | 2015-08-31 |

Điều chỉnh nó, nếu bạn thực sự muốn sử dụng khoảng thời gian như 90 ngày.

Bây giờ, nó là một kết hợp đơn giản bên trái với bảng đăng nhập để có được những gì bạn muốn:

select i.month as `Date`, count(distinct l.user_id) as `Active users`
from (
    select 
        date_format(date_sub(c.date, interval 1 day), '%Y-%m') as month,
        date_sub(c.date, interval 3 month) as first_day,
        date_sub(c.date, interval 1 day)   as last_day
    from calendar c
    where day(c.date) = 1
      and c.date between '2015-02-01' and '2015-09-01'
) i
left join login_table l on l.login_date between i.first_day and i.last_day
group by 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. Làm thế nào để sử dụng Nhóm Theo và tự tham gia để trả về bộ kết quả giá tối thiểu, tối đa, mở và đóng hàng ngày?

  2. Chia các giá trị được phân tách bằng dấu phẩy thành các hàng riêng lẻ

  3. Làm cách nào tôi có thể sao chép một hàng / bản ghi từ phiên bản MySQL này sang phiên bản MySQL khác?

  4. Làm thế nào để chuyển đổi chuỗi với phân số thành float trong Python

  5. Có cách nào để xem một truy vấn đã chuẩn bị vì nó sẽ được thực thi trên cơ sở dữ liệu không?