2016-08-02 3 views
2
SELECT COUNT(*) 
FROM (
    SELECT l.userid 
    FROM (
     SELECT DISTINCT userid, CAST(tmstmp AS DATE) 
     FROM logins 
     WHERE type <> 'mobile' 
     AND tmstmp BETWEEN '2013-04-21' AND '2014-04-21') l 
    GROUP BY l.userid 
    HAVING count(*) > 5) t; 

こんにちは、このクエリをクリーンアップする方法を教えてもらえますか?おそらくネストしたテーブルの1つを削除するための巧妙な方法はありますか?前もって感謝します。ネストしたテーブルでSQLクエリをクリーンアップする

+0

このクエリでは、どのような処理が行われるのですか?指定した日付の間に5回以上ログインしたユーザーの数を数えますか? – Will

+0

はい、そうです。ちょっと見栄えがいいように見えませんでした。 –

答えて

0

他のaggregateの中にaggregateがあります。私は、これは、単一のサブクエリを使用して、あなたの最良の選択肢だと思う:

WITHを使用して
SELECT COUNT(*) 
FROM (
    SELECT userid 
    FROM logins 
    WHERE type <> 'mobile' AND tmstmp BETWEEN '2013-04-21' AND '2014-04-21' 
    GROUP BY userid 
    HAVING count(distinct CAST(tmstmp AS DATE)) > 5 
) t 
+0

はい、うまくいきました!非常にきれいな解決策。ありがとうございました! –

0

は、それが読みやすくなります。

WITH matching_users AS (
    SELECT userid 
    FROM logins 
    WHERE type <> 'mobile' AND tmstmp BETWEEN '2013-04-21' AND '2014-04-21' 
    GROUP BY userid 
    HAVING count(distinct CAST(tmstmp AS DATE)) > 5 
) 
SELECT count(*) FROM matching_users 
+0

残念ながら 'mysql'は' common table expressions'をサポートしていません。 – sgeddes

0

ここでそれを行うための一つの方法だ:

SELECT COUNT(*) 
FROM (
SELECT userid, COUNT(DISTINCT CAST(tmstmp AS DATE)) as number_of_logins 
FROM logins l 
WHERE type <> 'mobile' AND tmstmp BETWEEN '2013-04-21' AND '2014-04-21' 
GROUP BY l.userid 
HAVING number_of_logins > 5) t 

これが取得します5日以上のユーザーを持つユーザーのみをカウントします。

関連する問題