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);