次のコードのようにSELECT文でuser_masterテーブルのinstall_datetimeを選択します。
この後のGYOUP BY句およびHAVING句で以下の条件を満たすようにします
①login_logテーブルで各ユーザー毎にinstall_datetimeから三日以内に3つ以上のuser_idが表示されているuser_idをGROUP_BYに指定する
SQL
1SELECT install_datetime AS days, user_id 2FROM user_master 3WHERE delete_flg=0 AND days LIKE '3%' 4GROUP BY user_id 5HAVING user_id IN(SELECT user_id 6 FROM login_log 7 WHERE COUNT(user_id)>=3 AND timestamp BETWEEN days AND DATEADD(day, 3, days));
この時条件①を満たすコードとしてuser_masterテーブルのinstall_datetimeをHAVING句で再び使用して見たのですが、うまく行きません。
条件①を満たすために何か良い手法はないかご教授いただけないでしょうか?
またテーブルは以下のように作成しました
SQL
1CREATE TABLE user_master 2(user_id INTEGER, 3 install_datetime CHAR(13), 4 delete_flg INTEGER); 5 6INSERT INTO user_master VALUES (10001, '3/19/16 15:45', 0), 7 (10002, '3/21/16 12:30', 1), 8 (10003, '3/23/16 9:15', 0), 9 (10004, '3/25/16 6:00', 0), 10 (10005, '3/19/16 15:45', 1); 11 12 13CREATE TABLE login_log 14(user_id INTEGER, 15 timestamp CHAR(18)); 16 17INSERT INTO login_log VALUES (10001, '3/19/16 15:50'), 18 (10001, '3/20/16 0:20'), 19 (10001, '3/23/16 14:10'), 20 (10001, '3/24/16 0:15'), 21 (10002, '3/21/16 12:50'), 22 (10003, '3/23/16 11:00'), 23 (10003, '3/24/16 9:10'), 24 (10003, '3/24/16 11:20'); 25
追記
テーブルは与えられているもので、データ型や内容等は変更できないものとして、テーブルの内容を変更せずに条件を満たすことを考えてます。
解決方法メモ
条件
delete_flg=0
install_datetime LIKE '4%
timestampがinstalldatetimeから3日以内の範囲であること
login_logのuser_idが3回以上表示されていること
手順1.条件を分解、各条件を満たすために順に割り当てていく
手順2.GROUP BY句でグループ分けするものを決める、他はWHERE句で指定
SQL
1SELECT L.user_id, U.install_datetime , COUNT(L.user_id) 2FROM login_log AS L INNER JOIN user_master AS U 3ON L.user_id=U.user_id 4WHERE STR_TO_DATE(L.timestamp,'%m/%d/%y %H:%i') BETWEEN STR_TO_DATE(U.install_datetime,'%m/%d/%y %H:%i') and STR_TO_DATE(U.install_datetime,'%m/%d/%y %H:%i') + interval 3 day AND 5U.delete_flg=0 AND U.install_datetime LIKE '4%' 6GROUP BY L.user_id 7HAVING COUNT(*)>=3
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。