PostgreSQL - ошибка при выполнении не в - PullRequest
0 голосов
/ 08 апреля 2020

вот таблица:

create table video_call (
timestamp timestamp,
callerid int,
receiverid int,
call_length int);

insert into video_call values
('2018-12-12 01:01:01', 1, 2, 3),
('2019-01-01 01:01:01', 1, 3, 5),
('2019-01-01 01:01:01', 2, 4, 3),
('2019-01-01 01:01:01', 5, 6, 3),
('2019-01-02 01:01:01', 3, 4, 3),
('2019-01-03 01:01:01', 3, 5, 3),
('2019-01-04 01:01:01', 3, 7, 3);

Теперь я хотел бы получить новых пользователей в день 2019-01-01. Вот мой ответ:

select user from
(select distinct callerid as user from video_call where to_char(timestamp, 'YYYY-MM-DD') = '2019-01-01'
union
select distinct receiverid as user from video_call where to_char(timestamp, 'YYYY-MM-DD') = '2019-01-01') as t
where user not in 
(select distinct callerid as user from video_call where to_char(timestamp, 'YYYY-MM-DD') < '2019-01-01'
union
select distinct receiverid as user from video_call where to_char(timestamp, 'YYYY-MM-DD') < '2019-01-01');

тогда получите эту ошибку:

ERROR:  operator does not exist: name = integer
LINE 5: where user not in 
                   ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 250

Есть идеи об этом? Я уже проверил, что все подзапросы работают. Спасибо

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

user - зарезервированное слово, которое разрешается в имя текущего пользователя PostgreSQL, вошедшего в систему. Вы можете увидеть это, выполнив что-то вроде:

select user from
(select distinct callerid as user from video_call where to_char(timestamp, 'YYYY-MM-DD') = '2019-01-01') as t;
  user  
--------
 jjanes
 jjanes
 jjanes

Для того, чтобы он ссылался на псевдоним столбца таблицы с именем «пользователь», вам необходимо указать его в качестве имени таблицы или поставить в двойные кавычки, или еще лучше, просто начните по-другому.

0 голосов
/ 08 апреля 2020

Я бы предложил написать это следующим образом:

select v.userid
from video_call vc cross join lateral
     (values (vc.callerid), (vc.receiverid)) v(userid)
where timestamp < '2019-01-02'
group by v.userid
having min(timestamp) >= '2019-01-01';

Кажется, что это более простой подход, и он должен обойти ваши проблемы с синтаксисом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...