Как удалить дубликаты строк в SQL-запросе?

Ответ

В SQL есть два основных подхода:

1. Ключевое слово DISTINCT Удаляет дубликаты из результирующего набора по всем выбранным столбцам.

-- Уникальные значения из одного столбца
SELECT DISTINCT department FROM employees;

-- Уникальные комбинации из нескольких столбцов
SELECT DISTINCT first_name, last_name FROM users;

2. Агрегация с GROUP BY Позволяет не только удалить дубликаты, но и выполнить вычисления над группами.

-- Уникальные имена с подсчетом количества повторений
SELECT first_name, COUNT(*) as count
FROM users
GROUP BY first_name;

Важные различия:

  • DISTINCT применяется ко всему набору результатов после выборки.
  • GROUP BY группирует строки перед применением агрегатных функций (COUNT, SUM, AVG).
  • Для производительности на больших таблицах с GROUP BY часто нужны индексы по группируемым полям.

В коде (Python):

# Использование set (порядок не сохраняется)
data = [1, 2, 2, 3, 1]
unique_data = list(set(data))  # [1, 2, 3]

# Сохранение порядка появления (Python 3.7+)
from collections import OrderedDict
unique_ordered = list(dict.fromkeys(data))  # [1, 2, 3]

Ответ 18+ 🔞

А, слушай, про эти ваши DISTINCT и GROUP BY, блядь. Ну, как бы, два способа, чтобы убрать повторы, но они, сука, разные, как хуй и палец, понимаешь?

1. DISTINCT — это типа «выкинь повторы, и всё» Вот просто взял и выкинул, как мусор, нахуй. Применяется ко всему, что после SELECT вылезло.

-- Смотри, какие отделы вообще есть, без повторов
SELECT DISTINCT department FROM employees;

-- А вот уникальные пары имени и фамилии, блядь
SELECT DISTINCT first_name, last_name FROM users;

Просто, быстро, без затей. Но нихуя больше не сделаешь — только уникальность.

2. GROUP BY — это уже посерьёзнее, блядь Тут уже не просто выкинуть, а сгруппировать и, сука, посчитать что-то можно! Это как не просто разобрать бардак в комнате, а ещё и посчитать, сколько носков каждого цвета.

-- Уникальные имена и сколько раз они встретились, ёпта
SELECT first_name, COUNT(*) as count
FROM users
GROUP BY first_name;

А теперь, блядь, важный момент, чтобы не облажаться:

  • DISTINCT работает после того, как всё выбрал — просто отфильтровал результат, как сито.
  • GROUP BY — это сначала сгруппировал строки, а потом уже к каждой группе можно применить COUNT, SUM, AVG и прочую хуйню.
  • И да, на больших таблицах с GROUP BY без индексов по тем полям, по которым группируешь, можно, блядь, до второго пришествия ждать. Серьёзно, производительность ебётся в ноль.

Ну и в Питоне, для полноты картины:

# Через set — быстро, но порядок, блядь, нахуй слетит
data = [1, 2, 2, 3, 1]
unique_data = list(set(data))  # [1, 2, 3] (порядок хрен знает какой)

# Если порядок появления важен (Python 3.7+)
from collections import OrderedDict
unique_ordered = list(dict.fromkeys(data))  # [1, 2, 3] (порядок сохранился)

Вот и вся магия, ёпта. Выбирай, что тебе надо: просто отсеять повторы или ещё и статистику по ним собрать.