удалить лишние записи из таблици созданной с помощью with

hommePibre
Дата: 12.04.2015 14:33:59
Ребят привет.

Есть задача из первоночально полученных данных убрать повторные записи по user_id(у каждой записи есть уникальный id).

Написал вот такой запрос

with the_t as (
select distinct b.user_id,
b.created_date_time::date,
b.id,
b.status,
b.country_id
from b
where b.created_date_time>'2015-04-09' and b.status='completed'
)

delete from the_t
where exists (select ID from
the_t where user_id = the_t.user_id and ID < the_t.ID)

Но такой запрос падает с ошибкой:
ERROR: relation "the_t" does not exist
LINE 17: delete from the_t
^
********** Ошибка **********

ERROR: relation "the_t" does not exist
SQL-состояние: 42P01
Символ: 346


Что я делаю не так? Почему он считает что табличка не создана?

Спасибо.
Maxim Boguk
Дата: 12.04.2015 14:52:07
hommePibre,

delete from the_t
Нельзя удалять из результата WITH поздапроса а только из реальных таблиц.
Вы наверное имели в виду
delete from b 
?

--
Maxim Boguk
www.postgresql-consulting.ru
hommePibre
Дата: 12.04.2015 19:27:31
Maxim Boguk,

теперь понятно почему не работает( спасибо

а есть лекгий и быстрый способ из результата with создать таблицу?

и удалять из b у меня прав не хватит)
p2.
Дата: 12.04.2015 22:26:28
hommePibre
из результата with создать таблицу
select into/ctas, но обычно проще дописать where, чем что-то создавать ради удаления.
И еще, distinct id также наводит на мысль о полном непонимании предмета. Базы данных не та область, где стоит что-то делать нахрапом, чтобы потом с этим мучиться пользователям. Сначала книжки, потом тестовые задачки, потом осмысленные вопросы на форуме.
hommePibre
Дата: 12.04.2015 22:56:01
p2.,

distinct остался от чего то другого у меня, он тут не нужен)

А на счет понимая предмета это вы правы, храмает причем сильно) Но мне обычно сложнее простого select'а с join'ами не нужно писать.

А вот эту задачу приходится решать чем получится.

Создать свою таблицу мне придется из-за того что я не могу вносить изменения в исходную.
p2.
Дата: 12.04.2015 23:19:07
hommePibre
Создать свою таблицу мне придется из-за того что я не могу вносить изменения в исходную.
Наверное не просто так не дают портить исходные данные. Для такого подхода чаще выбирают всякие экселы. Почему-то считается, что они, в отличие от sql, знаний не требуют.
Какие изменения вносить? "Удаления" ради уникализации user_id элементарно наложить на исходные данные через агрегацию или distinct on.
Прочие изменения в отрыве от исходных данных тоже выглядят сомнительно, а в связи - их надо делать соответственно связанной таблицей, чтобы не потом не бороться с очередной мегапроблемой, как скопировать изменения из источника и не похерить свои.
MasterZiv
Дата: 13.04.2015 01:39:27
hommePibre
Maxim Boguk,

теперь понятно почему не работает( спасибо

а есть лекгий и быстрый способ из результата with создать таблицу?

и удалять из b у меня прав не хватит)


удалить дубликаты таким образом у тебя однозначно не получится.
hommePibre
Дата: 13.04.2015 15:42:11
p2.
hommePibre
Создать свою таблицу мне придется из-за того что я не могу вносить изменения в исходную.
Наверное не просто так не дают портить исходные данные. Для такого подхода чаще выбирают всякие экселы. Почему-то считается, что они, в отличие от sql, знаний не требуют.
Какие изменения вносить? "Удаления" ради уникализации user_id элементарно наложить на исходные данные через агрегацию или distinct on.
Прочие изменения в отрыве от исходных данных тоже выглядят сомнительно, а в связи - их надо делать соответственно связанной таблицей, чтобы не потом не бороться с очередной мегапроблемой, как скопировать изменения из источника и не похерить свои.


классная идея про "наложить на исходные данные через агрегацию или distinct on"! спасибо!)

но меня инетересуют уникальные и первые записи по определенному user_id

То есть получается нужно делать так:
1)получаем уникальный список user_id
2)join'ом отфильтровываем лишее
Только вот где гарантия что остануться только первые записи?
thorn
Дата: 13.04.2015 16:17:58
hommePibre,

min(ctid)