Подтвердить что ты не робот

Как выбрать уникальные записи по 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

Только одна запись возвращается из дубликата вместе с остальными уникальными записями.

4b9b3361

Ответ 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 метода:

  1. DISTINCT
  2. ГРУППА ПО
  3. Subquery
  4. Общее табличное выражение (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 строк