Раздел 42 · Аналитика данных с нуля

DISTINCT: уникальные значения

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Бран · продюсер «Хроник Пограничья»

Инвестор спросил, сколько у нас платящих игроков. Маркетинг говорит «1250». Мне кажется, это много для нашей игры. Проверь?

Подозрение Брана верное, и дело не в маркетинге, а в одном слове. «Сколько платящих» и «сколько платежей» звучат похоже, а считаются по-разному. Сегодня учимся убирать повторы и считать уникальное.

Гостевая книга на входе

Представь гостевую книгу в таверне. Каждый вошедший расписывается, и завсегдатай за месяц оставит тридцать подписей. Сколько строк в книге? Сотни. Сколько разных гостей? Надо пройти по книге и вычеркнуть повторные имена.

В таблицах та же история. В characters 5602 строки, у каждой свой класс, и классы повторяются:

SELECT class
FROM characters
LIMIT 6;
 class
---------
 warrior
 rogue
 priest
 ranger
 ranger
 rogue

DISTINCT: вычеркнуть повторы

Слово DISTINCT сразу после SELECT делает то же, что и человек с гостевой книгой: из одинаковых строк оставляет одну.

SELECT DISTINCT class
FROM characters
ORDER BY class;
 class
---------
 mage
 priest
 ranger
 rogue
 warrior

Пять классов на 5602 персонажа. ORDER BY здесь только выстраивает список по алфавиту: сам DISTINCT порядок не обещает.

Уникальна вся строка, а не столбец

Если после DISTINCT несколько столбцов, повтором считается строка, у которой совпали все столбцы сразу. Пара «маг, эльф» и пара «маг, орк» разные, обе останутся.

SELECT DISTINCT class, race
FROM characters
WHERE level = 60
ORDER BY class, race;
 class   | race
---------+-------
 mage    | dwarf
 mage    | elf
 mage    | human
 mage    | orc
 priest  | elf
 priest  | orc
 ranger  | dwarf
 ranger  | elf
 ranger  | human
 ranger  | orc
 rogue   | elf
 rogue   | human
 rogue   | orc
 warrior | dwarf
 warrior | elf
 warrior | human
 warrior | orc

Во всей игре встречаются все 20 сочетаний пяти классов и четырёх рас. А на 60-м уровне только 17: жреца-гнома, жреца-человека и разбойника-гнома до потолка пока никто не докачал. Такая находка уже интересна геймдизайнеру.

Частая ошибка: написать SELECT DISTINCT class, race и ждать список уникальных классов. DISTINCT не умеет действовать на один столбец из нескольких, он всегда про строку целиком.

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.