I'm using mysql. I want to count the minimum, maximum, and average number of different tags per movie from one table.
Exclude the duplicate:
- same tag given by the same user to the same movie
- same tag given by different users to the same movie
Example: table 'tags'
| userId | movieId | tag |
|---|---|---|
| 1 | 1 | crime |
| 1 | 2 | dark |
| 1 | 2 | dark |
| 2 | 2 | greed |
| 2 | 2 | dark |
| 3 | 3 | music |
| 3 | 3 | dance |
| 3 | 3 | quirky |
| 4 | 3 | dance |
| 4 | 3 | quirky |
Expect result:
| movieId | Min_Tag | Max_Tag | Avg_Tag |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 1 | 2 | 0.66... |
| 3 | 1 | 2 | 0.6 |
I try to write query like below, but it shows an error.
SELECT
DISTINCT movieId,
MIN(COUNT(DISTINCT tag) AS Min_Tag,
MAX(COUNT(DISTINCT tag) AS Max_Tag,
AVG(COUNT(DISTINCT tag) AS Avg_Tag,
FROM (
SELECT userId,movieId,tag
FROM tags
GROUP BY userId, movieId, tag
) AS non_dup
GROUP BY movieId;
CodePudding user response:
You have to rewrite your query
First you need the count per tag and movie
and fromm that you can calculate min max and avg
SELECT
movieId,
MIN(count_tag) AS Min_Tag,
MAX(count_tag) AS Max_Tag,
AVG(count_tag) AS Avg_Tag
FROM
(SELECT movieId,tag, count(*) count_tag
FROM tags
GROUP BY movieId, tag) non_dup
GROUP BY movieId
| movieId | Min_Tag | Max_Tag | Avg_Tag |
|---|---|---|---|
| 1 | 1 | 1 | 1.0000 |
| 2 | 1 | 3 | 2.0000 |
| 3 | 1 | 2 | 1.6667 |
