17

ユーザーの Web ページ訪問行動の記録を保持するテーブルの場合、複数の Web ページにアクセスするユーザーを選択するにはどうすればよいですか。

このテーブルの構造は次のとおりです。

userId        webpageId       visitTime
  0              123            ...
  0              124            ...
  1              123            ...
 ...             ...            ...

私は次を使用して数えることができます:

SELECT userId, COUNT(DISTINCT webpageId) AS count FROM visits GROUP BY userId;

次のような結果が得られます。

userId          count
  0               2
  1               1
  2               6
 ...             ...

次のような最終結果が得られるクエリを実行するにはどうすればよいですか。

userId
  0
  2
 ...

それぞれが複数の DISTINCT Web ページにアクセスしたユーザーです

4

3 に答える 3

36

having句を追加するだけです

SELECT userId, COUNT(DISTINCT webpageId) AS count 
FROM visits 
GROUP BY userId
HAVING COUNT(DISTINCT webpageId) > 1

しかし、もしあなただけがID

SELECT userId
FROM visits 
GROUP BY userId
HAVING COUNT(DISTINCT webpageId) > 1

HAVING句ではなく句でフィルタリングする理由WHEREは、句が集約WHEREされた列をサポートできないためです。

于 2013-03-06T02:12:13.143 に答える
5

これを試して:

SELECT userId, COUNT(DISTINCT webpageId) AS count FROM visits GROUP BY userId
having COUNT(DISTINCT webpageId) > 1

もっと:持っている

于 2013-03-06T02:12:25.300 に答える
4

この場合はwhileHAVINGが良い方法ですが、クエリをネストできることに注意してください。

SELECT userId, pageCount
FROM (
    SELECT userId, COUNT(DISTINCT webpageId) AS pageCount
    FROM visits 
    GROUP BY userId) AS n
WHERE pageCount > 1

実際のクエリ プランは、特にHAVING最適化された場合は異なる場合がありますが、プランが異なる必要がある理由はありません。(問題または懸念がある場合は、特定の RDBMS/バージョンの計画を比較してください。)

于 2013-03-06T03:25:02.977 に答える