SQL: понимание того, как SELECT DISTINCT устраняет дубликаты - PullRequest
1 голос
/ 19 апреля 2019

У меня есть следующая таблица под названием genkeyword:

---------------------------------------------------------------------------
|  id     |      title           |   genre       | keyword      |    year |
----------------------------------------------------------------------------
| 315     |  Harry Potter        |   drama       | magic        |   2011  |
| 315     |  Harry Potter        |   mystery     | magic        |   2011  |
| 315     |  Harry Potter        |   adventure   | magic        |   2011  |
| 315     |  Harry Potter        |   fantasy     | magic        |   2011  |
| 315     |  Harry Potter        |   drama       | witch        |   2011  |
| 315     |  Harry Potter        |   mystery     | witch        |   2011  |
| 315     |  Harry Potter        |   adventure   | witch        |   2011  |
| 315     |  Harry Potter        |   fantasy     | witch        |   2011  |
| 407     |  Cinderella          |   fantasy     | prince       |   2015  |
| 407     |  Cinderella          |   drama       | prince       |   2015  |
| 407     |  Cinderella          |   fantasy     | prince       |   2015  |
| 407     |  Cinderella          |   drama       | prince       |   2015  |
| 826     |  The Shape of Water  |   horror      | scientist    |   2017  |
| 826     |  The Shape of Water  |   adventure   | scientist    |   2017  |
| 826     |  The Shape of Water  |   thriller    | scientist    |   2017  |
| 826     |  The Shape of Water  |   drama       | scientist    |   2017  |
| 826     |  The Shape of Water  |   horror      | friendship   |   2017  |
| 826     |  The Shape of Water  |   adventure   | friendship   |   2017  |
| 826     |  The Shape of Water  |   thriller    | friendship   |   2017  |
| 826     |  The Shape of Water  |   drama       | friendship   |   2017  |
---------------------------------------------------------------------------

У меня есть следующий запрос, который определяет частоту всех жанров, которые каждый фильм в приведенной выше таблице имеет с Гарри Поттером:

select title, year, count(distinct genre) as genre_freq from genkeyword
where genre in (select genre from genkeyword where title='Harry Potter') and 
title <> 'Harry Potter' group by 
title, year order by genre_freq desc;

Вывод должен быть:

--------------------------------------------------
| title                |    year   |    genre_freq |
---------------------------------------------------
| Cinderella           |    2015   |      2        |
| The Shape of Water   |    2017   |      2        |
----------------------------------------------------

У меня проблемы с пониманием, как именно работает счет (отдельный жанр) в запросе. Я знаю, что SELECT DISTINCT возвращает только отдельные значения и удаляет дубликаты записей из результатов. Я не уверен, когда счет (отличный жанр) фактически удаляет дубликаты записей. Мне бы очень хотелось понять, что делает запрос за кулисами.

Что я знаю до сих пор:

Для каждого кортежа в genkeyword:

  • «Где жанр в (выберите жанр из genkeyword, где title = 'Harry Potter')» », извлекает все строки, в которых значение атрибута жанра является жанром в Harry Potter.
  • Если жанр в рассматриваемом кортеже находится в наборе результатов, возвращаемом предложением where, то он считается по количеству (отличный жанр). Также значение фильма в рассматриваемом кортеже не может быть Гарри Поттером, иначе оно не будет засчитано.

Однако, когда счетчик (отдельный жанр) фактически удаляет дубликаты? Любые идеи приветствуются.

1 Ответ

1 голос
/ 19 апреля 2019

Короче говоря, COUNT(DISTINCT [Colnum]) будет делать DISTINCT для удаления значения столбца дубликатов перед ним COUNT.

Из ваших данных и условий запроса.

| title              | genre     | year |
| ------------------ | --------- | ---- |
| Cinderella         | fantasy   | 2015 |
| Cinderella         | drama     | 2015 |
| Cinderella         | fantasy   | 2015 |
| Cinderella         | drama     | 2015 |
| The Shape of Water | adventure | 2017 |
| The Shape of Water | drama     | 2017 |
| The Shape of Water | adventure | 2017 |
| The Shape of Water | drama     | 2017 |

Когдавы используете count(distinct genre), вы удалите genre, который дублирует.

Вы можете получить count как этот результат.

| title              | year | genre     |
| ------------------ | ---- | --------- |
| Cinderella         | 2015 | fantasy   |
| Cinderella         | 2015 | drama     |
| The Shape of Water | 2017 | adventure |
| The Shape of Water | 2017 | drama     |

Таким образом, вы получите, когда будете использовать ваш запрос.

| title                |    year   |    genre_freq  |
 ----------------------|-----------|----------------|
| Cinderella           |    2015   |      2         |
| The Shape of Water   |    2017   |      2         |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...