2017-05-23 13 views
0

データベースに、ユーザ のアクティブ期間または非アクティブ期間を記録しているテーブルがあります。ユーザーがアクティブから非アクティブに切り替えるか、またはその逆の場合(またはアドレスなどの他の属性が変更された場合)、新しいレコードが追加されます。簡易版は、次のようになります。MySQLの時間範囲内のエントリ数をカウントします

UserID  state   state_from   state_to 

1   active  2016-12-14  2017-01-15 
2   active  2016-12-14  2017-02-02 
3   active  2017-01-01  NULL 
1   inactive  2017-01-16  2017-03-05 
2   inactive  2017-02-02  NULL 
1   active  2017-03-06  NULL 

私は、月単位で、「アクティブ」ある時点での状態を持っていたどのように多くのユーザーカウントしたいと思います。 1月の所望の出力テーブル三月までのようになります。

date   user_count 

2017-01  3  
2017-02  2 
2017-03  2 

特定のタイムスタンプのために(例えば、2017年1月)、私は次のクエリを使用します。

SET @stamp = '2017-01'; 
SELECT @stamp AS date, COUNT(UserID) AS user_count 
FROM se_user 
WHERE (state LIKE 'active' AND @stamp BETWEEN DATE_FORMAT(state_from,'%Y-%m') AND DATE_FORMAT(state_to,'%Y-%m')) 
OR (state LIKE 'active' AND DATE_FORMAT(state_from,'%Y-%m') <= @stamp AND DATE_FORMAT(state_to,'%Y-%m') IS NULL); 

私の問題は、私は日付の範囲(1月から3月と言う)のためにそれを行う方法がわからないこと、です。これを行う方法はありますか?

例データベースやテーブル

-- Set up a test database 
DROP DATABASE IF EXISTS se_toy_example; 

CREATE DATABASE se_toy_example; 

USE se_toy_example; 

-- Create example table 
DROP TABLE IF EXISTS se_user; 

CREATE TABLE se_user (
    UserID INT(10), 
    state VARCHAR(10), 
    state_from DATE, 
    state_to DATE 
); 
-- Populate table 
INSERT INTO se_user (UserID,state,state_from,state_to) 
VALUES (1,'active','2016-12-14','2017-01-15'), 
     (2,'active','2016-12-14','2017-02-02'), 
     (3,'active','2017-01-01',NULL), 
     (1,'inactive','2017-01-16','2017-03-05'), 
     (2,'inactive','2017-02-02',NULL), 
     (1,'active','2017-03-06',NULL); 

答えて

0

あなたは、各月のdt_begindt_endで、月の日付範囲を持っているcalendar_tableを必要としています。

今年のクエリは次のようになります。

SQL DEMO

SELECT c.dt_begin, count(*) 
FROM calendar_table c 
JOIN se_user u 
    ON c.dt_begin <= COALESCE(u.state_to, curdate()) 
AND c.dt_end >= u.state_from 

WHERE dt_begin >= '2017-01-01' 
    AND dt_begin <= '2017-12-01' 
    AND state = 'active' 
GROUP BY c.dt_begin 
    ; 

OUTPUT

enter image description here

注: 0活性を有するヶ月がしたい場合は、LEFT JOINを使用することができます。

関連する問題