2016-08-11 1 views
-2

テーブルtどのようにローリングウィンドウを使用しますか?この表の

send time   user 
2016-07-24 12:00:00 a 
2016-07-24 01:00:00 b 
2016-07-23 00:00:00 a 
2016-07-22 00:00:00 a 
2016-07-21 00:00:00 a 
2016-07-20 00:00:00 a 
2016-07-19 12:00:00 b 
2016-07-18 11:00:00 c 

、私はローリング・ウィンドウを使用して、最後の3日間にユニークなアクティブなユーザーをカウントします。 7月24日に

、カウント数(個別のユーザーは)2 - である。そして、7月23日に、結果は1

であるべきで、7月20日に、結果は3

でなければなりませんし、私がしたいです一度に歴史的結果を得る。

mysqlでクエリを書くにはどうすればよいですか?

+1

はそれについて何を転がしていると? – Drew

+0

素晴らしい!何を試しましたか? –

+0

幸いにもストロベリーによるロールバック:p – Drew

答えて

0
create table t 
( id int auto_increment primary key, 
    send_time datetime not null, 
    user varchar(100) not null 
); 

insert t (send_time,user) values 
('2016-07-24 00:00:00',  'a'), 
('2016-07-24 01:00:00',  'b'), 
('2016-07-23 12:00:00',  'a'), 
('2016-07-22 12:00:00',  'a'), 
('2016-07-21 12:00:00',  'a'), 
('2016-07-20 12:00:00',  'a'), 
('2016-07-19 12:00:00',  'b'), 
('2016-07-18 11:00:00',  'c'); 

クエリ:それは最後の3日間ローリングする必要がある場合

select date(send_time),count(distinct user) 
from t 
group by date(send_time) 
order by date(send_time) desc; 
+-----------------+----------------------+ 
| date(send_time) | count(distinct user) | 
+-----------------+----------------------+ 
| 2016-07-24  |     2 | 
| 2016-07-23  |     1 | 
| 2016-07-22  |     1 | 
| 2016-07-21  |     1 | 
| 2016-07-20  |     1 | 
| 2016-07-19  |     1 | 
| 2016-07-18  |     1 | 
+-----------------+----------------------+ 
7 rows in set (0.00 sec) 

、ちょうど最後にLIMIT 3を行います。

人々のためにデータを設定するために時間をかけてください。他の人があなたを助けるように助けてください写真はカウントされません。

0

ドリューのモデルを使用しますが、正しいクエリ;-p

SELECT DATE(x.send_time) send_time 
    , COUNT(DISTINCT y.user) unique_users 
    FROM t x 
    JOIN t y ON DATE(y.send_time) BETWEEN DATE(x.send_time) - INTERVAL 3 DAY AND DATE(x.send_time) 
GROUP 
    BY DATE(x.send_time) 
ORDER 
    BY send_time DESC; 
関連する問題