Как выбрать уникальные записи по SQL
Когда я выполняю "SELECT * FROM table", я получил результаты, как показано ниже:
1 item1 data1
2 item1 data2
3 item2 data3
4 item3 data4
Как вы можете видеть, есть записи dup из столбца2 (item1 дублируются). Итак, как я мог получить результат следующим образом:
1 item1 data1
2 item2 data3
3 item3 data4
Только одна запись возвращается из дубликата вместе с остальными уникальными записями.
Ответы
Ответ 1
Для этого вы можете использовать SELECT DISTINCT
или GROUP BY
.
SELECT DISTINCT a, c
FROM table_c
или
SELECT a, b
FROM table_c
GROUP BY a, b
GROUP BY
будет более полезной, если вы хотите использовать некоторую агрегатную функцию типа COUNT()
или SUM()
SELECT a, b, count(*)
FROM table_c
GROUP BY a, b
SELECT a, b, sum(d)
FROM table_c
GROUP BY a, b
Ответ 2
Если вам нужно только удалить дубликаты, используйте DISTINCT
. GROUP BY
следует использовать для применения операторов агрегатов к каждой группе
GROUP BY v DISTINCT
Ответ 3
Это зависит от того, какой роуд вы хотите вернуть для каждого уникального элемента. Кажется, что ваши данные указывают минимальное значение данных, поэтому в этом случае для SQL Server.
SELECT item, min(data)
FROM table
GROUP BY item
Ответ 4
просто используйте внутреннее соединение, потому что group by не будет работать с несколькими столбцами, говоря, что они не содержатся ни в статистической функции.
SELECT a.*
FROM yourtable a
INNER JOIN
(SELECT yourcolumn,
MIN(id) as id
FROM yourtable
GROUP BY yourcolumn
) AS b
ON a.yourcolumn= b.yourcolumn
AND a.id = b.id;
Ответ 5
Я считаю, что если я не могу использовать DISTINCT по какой-либо причине, тогда GROUP BY будет работать.
Ответ 6
Вы можете использовать 4 метода:
- DISTINCT
- ГРУППА ПО
- Subquery
- Общее табличное выражение (CTE) с ROW_NUMBER()
Рассмотрим следующий образец TABLE
с тестовыми данными:
/** Create test table */
CREATE TEMPORARY TABLE dupes(word text, num int, id int);
/** Add test data with duplicates */
INSERT INTO dupes(word, num, id)
VALUES ('aaa', 100, 1)
,('bbb', 200, 2)
,('ccc', 300, 3)
,('bbb', 400, 4)
,('bbb', 200, 5) -- duplicate
,('ccc', 300, 6) -- duplicate
,('ddd', 400, 7)
,('bbb', 400, 8) -- duplicate
,('aaa', 100, 9) -- duplicate
,('ccc', 300, 10); -- duplicate
Вариант 1: ВЫБЕРИТЕ DISTINCT
Это самый простой и прямой путь, но также и самый ограниченный:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
/*
word|num|
----|---|
aaa |100|
bbb |200|
bbb |400|
ccc |300|
ddd |400|
*/
Вариант 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;
/*
word|num|min|max|count|
----|---|---|---|-----|
aaa |100| 1| 9| 2|
bbb |200| 2| 5| 2|
bbb |400| 4| 8| 2|
ccc |300| 3| 10| 3|
ddd |400| 7| 7| 1|
*/
Вариант 3: Подзапрос
Используя подзапрос, вы можете сначала идентифицировать дублирующиеся строки, которые нужно игнорировать, а затем отфильтровать их во внешнем запросе с помощью конструкции WHERE NOT IN (subquery)
:
/** Find the higher id values of duplicates, distinct only added for clarity */
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
/*
id|
--|
5|
6|
8|
9|
10|
*/
/** Use the previous query in a subquery to exclude the dupliates with higher id values */
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;
/*
word|num|id|
----|---|--|
aaa |100| 1|
bbb |200| 2|
bbb |400| 4|
ccc |300| 3|
ddd |400| 7|
*/
Вариант 4: Общее табличное выражение с ROW_NUMBER()
В выражении общей таблицы (CTE) выберите ROW_NUMBER(), разделенный столбцом группы и упорядоченный в нужном порядке. Затем ВЫБЕРИТЕ только те записи, которые имеют 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;
/*
word|num|id|
----|---|--|
aaa |100| 1|
bbb |200| 2|
bbb |400| 4|
ccc |300| 3|
ddd |400| 7|
*/
Ответ 7
Чтобы получить все столбцы в вашем результате, вам нужно разместить что-то как:
SELECT distinct a, Table.* FROM Table
он поместит a в качестве первого столбца, а остальное будет ВСЕ из столбцов в том же порядке, что и ваше определение. Это означает, что будет повторяться столбец a.
Ответ 8
Выберите Eff_st
из
(
выберите EFF_ST, ROW_NUMBER() over (PARTITION BY eff_st) XYZ -
от ABC.CODE_DIM
)
где XYZ = 1
order by EFF_ST выборка только 5 строк