Є 4 методи, якими ви можете скористатися:
- ВІДМІНЕННЯ
- ГРУПА ЗА
- Підзапит
- Загальний вираз таблиці (CTE) з ROW_NUMBER ()
Розглянемо наступний зразок TABLE
із даними тестів:
CREATE TEMPORARY TABLE dupes(word text, num int, id int);
INSERT INTO dupes(word, num, id)
VALUES ('aaa', 100, 1)
,('bbb', 200, 2)
,('ccc', 300, 3)
,('bbb', 400, 4)
,('bbb', 200, 5)
,('ccc', 300, 6)
,('ddd', 400, 7)
,('bbb', 400, 8)
,('aaa', 100, 9)
,('ccc', 300, 10);
Варіант 1: ВИБЕРІТЬ ВИЗНАЧЕННЯ
Це найпростіший і прямий вперед, але також і найбільш обмежений спосіб:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
Варіант 2: GROUP BY
Угруповання дозволяє додавати агреговані дані, як і min(id)
, max(id)
, count(*)
і т.д .:
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
Варіант 3: Підзапит
Використовуючи підзапит, ви можете спочатку визначити повторювані рядки, які потрібно ігнорувати, а потім відфільтрувати їх у зовнішньому запиті за допомогою WHERE NOT IN (subquery)
конструкції:
SELECT distinct d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
SELECT *
FROM dupes
WHERE id NOT IN (
SELECT d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
)
ORDER BY word, num;
Варіант 4: Загальний вираз таблиці з ROW_NUMBER ()
У виразі загальної таблиці (CTE) виберіть РЯДОК НОМЕР (), розділений стовпцем групи та упорядкований у бажаному порядку. Потім ВИБЕРІТЬ лише ті записи, які містять ROW_NUMBER() = 1
:
WITH CTE AS (
SELECT *
,row_number() OVER(PARTITION BY word, num ORDER BY id) AS row_num
FROM dupes
)
SELECT word, num, id
FROM cte
WHERE row_num = 1
ORDER BY word, num;