#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. Используйте «», если имена столбцов содержат заглавные буквы.