Как удалить повторяющиеся значения из запроса

#postgresql #duplicates

Вопрос:

У меня следующая проблема, мне нужно удалить повторяющиеся значения из определенного столбца, который я запрашиваю. Никакого удаления!(Класс)

Школьно Школьный год Школьный рейтинг Имя класса Класс
65432 2001 5 ab 441
65432 2001 5 компакт-диск 442
65432 2001 6 a 443
65432 2001 6 b 444
56838 2001 5 ab 445
56838 2001 5 компакт-диск 446
56838 2001 6 ab 445
56838 2001 6 ef 447
12726 2001 5 мс 448
12726 2001 6 мс 448

Если вы посмотрите на значения classId, я повторил номера классов, потому что некоторые специальные школы иногда объединяют 2 класса для обоих классов. Проблема в том, что мой запрос должен показывать только 1 значение класса. Никаких повторов. Поэтому мы можем удалить любой дополнительный класс, который повторяется по значению и отображается только для 5-го класса.

Другими словами, мой стол должен в конечном итоге выглядеть так.

Школьно Школьный год Школьный рейтинг Имя класса Класс
65432 2001 5 ab 441
65432 2001 5 компакт-диск 442
65432 2001 6 a 443
65432 2001 6 b 444
56838 2001 5 ab 445
56838 2001 5 компакт-диск 446
56838 2001 6 ef 447
12726 2001 5 мс 448

Код обычно выглядит так.

 select schoolno,schoolyear,schoolgrade,classname,classId
from classgroup cg
 

Как я должен подойти к этому?

Ответ №1:

может быть, ты сможешь сделать это вот так:

 select
  first_value(schoolno) over w,
  first_value(schoolyear) over w,
  first_value(schoolgrade) over w,
  first_value(classname) over w,
  first_value(classId) over w
FROM
  classgroup
WINDOW w AS (PARTITION BY schoolno, schoolyear, classId ORDER BY schoolgrade);
 

Вы разделяете данные по schoolno schoolyear и classId и упорядочиваете schoolgrade их , а затем берете только первую строку каждого раздела.

Примечание: синтаксис может быть немного неправильным, так как я не смог его протестировать

Комментарии:

1. Я провел тест по вашему запросу, и все в порядке. Хороший подход.

2. Я попробовал, но получил тот же результат… это не удаление 2-й строки аналогичного класса, повторяющийся класс отображается дважды.

Ответ №2:

Попробуй это

 select cg1.* from classgroup cg1
left join classgroup cg2 on (cg1."ClassId"=cg2."ClassId" and cg1."Schoolgrade"<cg2."Schoolgrade")
where cg2."Schoolgrade" is null
 

Вывод:
введите описание изображения здесь

Комментарии:

1. Эй, значит, ваш запрос сработал в том случае, если повторяющиеся классы не повторяются. Однако я получаю вместо 5 6, даже если логика звучит нормально. есть ли способ применить заявление по делу, чтобы заставить его?

2. ваш метод был безупречен. Быстрый вопрос, для чего это»»? есть ли разница между cg2.schoolgrade и scg.»школьный рейтинг»?

3. Используйте «», если имена столбцов содержат заглавные буквы.