Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объединение двух таблиц / 25 сообщений из 26, страница 1 из 2
24.06.2019, 13:43
    #39829829
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Здравствуйте. С sql только начал знакомиться.

Есть таблица table1:


Есть таблица table2:


Задача получить такую таблицу:


То есть нужно получить самые новые по времени значения для всех объектов.
Столбец clock - это метка времени.

Нагуглил про order by clock desc limit 1

При выполнении этого запроса:
SELECT * FROM table 1 AS t1, dblink(‘параметры подключения к серверу’, ‘SELECT value, clock from table2 order by clock desc limit 1’) AS t2(value numeric, clock integer)
WHERE t1.id = t2.id

Выдает результат:


Ну то есть вторую строчку не выдает.
Я понимаю, что я как-то неправильно использую “order by clock desc limit 1”, но пока не понял как правильно.
Подскажите пожалуйста. Сижу гуглю, но пока не смог разобраться, а сделать надо быстро.
...
Рейтинг: 0 / 0
24.06.2019, 14:04
    #39829856
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
limit 1 стоит
одна запись и выдаётся
...
Рейтинг: 0 / 0
24.06.2019, 14:07
    #39829857
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
982183limit 1 стоит
одна запись и выдаётся
Да, я как раз экспериментировал сейчас с этим числом.
Можно поставить 2 и будет иногда возвращаться 1 строка, а иногда 2...
В общем чувствую, что не тот путь...
...
Рейтинг: 0 / 0
24.06.2019, 14:08
    #39829861
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Читаю про LEFT OUTER JOIN.
...
Рейтинг: 0 / 0
24.06.2019, 14:10
    #39829864
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Код: sql
1.
2.
with cte as (SELECT value, clock, row_number()over(partition by id order by clock desc) as rn from table2)
select * from cte where rn=1 
...
Рейтинг: 0 / 0
24.06.2019, 14:20
    #39829867
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
court, спасибо за ответ!

Выполнил этот запрос для второй таблицы.
Вернулось 7 строк:
...
Рейтинг: 0 / 0
24.06.2019, 14:22
    #39829868
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
clock - какой тип поля? В группировку надо включать id, т.е. на каждый id искать минимальное\максимальное значение clock.
Если clock имеет тип timestamp, то будет
Код: sql
1.
2.
3.
select t1.id, t1.obj,t2.value,t2.clock from table1 t1
join table2 t2 on t2.id=t1.id
where (t2.id,t2.clock) in (select id,max(clock) from table2 group by id);
...
Рейтинг: 0 / 0
24.06.2019, 14:22
    #39829869
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
А ID всего два, или может быть много?
...
Рейтинг: 0 / 0
24.06.2019, 14:24
    #39829870
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
982183А ID всего два, или может быть много?
id много
...
Рейтинг: 0 / 0
24.06.2019, 14:25
    #39829871
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
neya1,

и доджойни первую таблицу

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with cte as (SELECT value, clock, row_number()over(partition by id order by clock desc) as rn from table2)
select 
  t1.id, 
  t1.object, 
  t2.value, 
  t2.clock 
from table1 t1 inner join cte t2 
where t2.rn=1 
...
Рейтинг: 0 / 0
24.06.2019, 14:25
    #39829872
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Guzyaclock - какой тип поля?
[/src]

Во факту это метка времени, но почему-то тип данных integer...
...
Рейтинг: 0 / 0
24.06.2019, 14:25
    #39829873
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
fix
courtneya1,

и доджойни первую таблицу

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with cte as (SELECT id, value, clock, row_number()over(partition by id order by clock desc) as rn from table2)
select 
  t1.id, 
  t1.object, 
  t2.value, 
  t2.clock 
from table1 t1 inner join cte t2 on t1.id=t2.id 
where t2.rn=1 
...
Рейтинг: 0 / 0
24.06.2019, 14:39
    #39829881
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
neya1, попробуйте

Код: sql
1.
2.
3.
select t1.id, t1.obj,t2.value,to_timestamp(t2.clock) from table1 t1
join table2 t2 on t2.id=t1.id
where (t2.id,t2.clock) in (select id,max(clock) from table2 group by id);
...
Рейтинг: 0 / 0
24.06.2019, 14:46
    #39829887
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Guzya, court, спасибо за ответы.
Буду пробовать.
Сейчас соображаю как прикрутить dblink к вашим вариантам.
...
Рейтинг: 0 / 0
24.06.2019, 15:15
    #39829905
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Guzya, вроде так должно быть...

select t1.id, t1.object from table1 t1, dblink('параметры подключения к серверу','SELECT value, to_timestamp(clock) from table2') AS t2(value numeric, clock timestamp)
join t2 on t2.id=t1.id
where (t2.id, t2.clock) in (select id, max(clock) from t2 group by id);


Но возвращается:
ERROR: relation "t2" does not exist
LINE 2: join t2 on t2.itemid=t1.itemid


Я наверное балсбес снова чего-то не так понял.
...
Рейтинг: 0 / 0
24.06.2019, 15:22
    #39829913
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
neya1,

Поправил немножко, но результат прежний:

select t1.id, t1.object from table1 t1, dblink('параметры подключения к серверу','SELECT id, value, to_timestamp(clock) from table2') AS t2(id bigint, value numeric, clock timestamp)
join t2 on t2.id=t1.id
where (t2.id, t2.clock) in (select id, max(clock) from t2 group by id);
...
Рейтинг: 0 / 0
24.06.2019, 15:37
    #39829925
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
neya1neya1,

Поправил немножко, но результат прежний:

select t1.id, t1.object from table1 t1, dblink('параметры подключения к серверу','SELECT id, value, to_timestamp(clock) from table2') AS t2(id bigint, value numeric, clock timestamp)
join t2 on t2.id=t1.id
where (t2.id, t2.clock) in (select id, max(clock) from t2 group by id);так вроде
Код: sql
1.
2.
select t1.id, t1.object from table1 t1, dblink('параметры подключения к серверу','SELECT id, value, to_timestamp(clock) from table2') AS t2(id bigint, value numeric, clock timestamp)
where t2.id=t1.id and (t2.id, t2.clock) in (select id, max(clock) from t2 group by id);
...
Рейтинг: 0 / 0
24.06.2019, 15:38
    #39829926
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
courtneya1neya1,

Поправил немножко, но результат прежний:

select t1.id, t1.object from table1 t1, dblink('параметры подключения к серверу','SELECT id, value, to_timestamp(clock) from table2') AS t2(id bigint, value numeric, clock timestamp)
join t2 on t2.id=t1.id
where (t2.id, t2.clock) in (select id, max(clock) from t2 group by id);так вроде
Код: sql
1.
2.
select t1.id, t1.object from table1 t1, dblink('параметры подключения к серверу','SELECT id, value, to_timestamp(clock) from table2') AS t2(id bigint, value numeric, clock timestamp)
where t2.id=t1.id and (t2.id, t2.clock) in (select id, max(clock) from t2 group by id);


нее, не то
"ругается" на подзапрос в where
...
Рейтинг: 0 / 0
24.06.2019, 15:40
    #39829929
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
neya1,

пробуй так

Код: sql
1.
2.
3.
4.
select t1.id, t1.object 
from table1 t1, 
dblink('параметры подключения к серверу','SELECT id, value, to_timestamp(clock), row_number()over(partition by id order by clock desc) as rn from table2') AS t2(id bigint, value numeric, clock timestamp)
where t2.id=t1.id and t2.rn=1
...
Рейтинг: 0 / 0
24.06.2019, 15:42
    #39829932
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Попробуйте создать view к таблице table2 и уже ее использовать в запросе.

Код: sql
1.
2.
3.
CREATE VIEW myremote_table AS 
SELECT *
    FROM dblink('параметры подключения к серверу','SELECT id, value, clock from table2') AS t2(id bigint, value numeric, clock integer);



и потом

Код: sql
1.
2.
3.
select t1.id, t1.obj,t2.value,to_timestamp(t2.clock) from table1 t1
join myremote_table t2 on t2.id=t1.id
where (t2.id,t2.clock) in (select id,max(clock) from myremote_table group by id);
...
Рейтинг: 0 / 0
24.06.2019, 15:52
    #39829939
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
court,

ERROR: column t2.rn does not exist
LINE 4: where t2.id=t1.id and t2.rn=1
...
Рейтинг: 0 / 0
24.06.2019, 16:01
    #39829947
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
neya1court,

ERROR: column t2.rn does not exist
LINE 4: where t2.id=t1.id and t2.rn=1а ты его добавил ? :)
Есть это ?
court
Код: sql
1.
2.
3.
4.
select t1.id, t1.object 
from table1 t1, 
dblink('параметры подключения к серверу','SELECT id, value, to_timestamp(clock), row_number()over(partition by id order by clock desc) as rn from table2') AS t2(id bigint, value numeric, clock timestamp)
where t2.id=t1.id and t2.rn=1
...
Рейтинг: 0 / 0
24.06.2019, 16:07
    #39829952
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
court,

Да, добавил.

Если выполнить отдельно:

select t1.id, t1.object
from table1 t1,
dblink('параметры подключения к серверу','SELECT id, value, to_timestamp(clock), row_number()over(partition by id order by clock desc) as rn from table2') AS t2(id bigint, value numeric, clock timestamp)

то возвращается:
ERROR: remote query result rowtype does not match the specified FROM clause rowtype
...
Рейтинг: 0 / 0
24.06.2019, 16:11
    #39829956
neya1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
Guzya,

Я в конечном итоге хотел обернуть этот запрос в create view. То есть на выходе мне нужна view.
Делать представление на основе представления тоже можно, но у меня в голове это пока плохо умещается))
...
Рейтинг: 0 / 0
24.06.2019, 16:12
    #39829957
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение двух таблиц
тут ещё добавь (выделил)
neya1court,

Да, добавил.

Если выполнить отдельно:

select t1.id, t1.object
from table1 t1,
dblink('параметры подключения к серверу','SELECT id, value, to_timestamp(clock), row_number()over(partition by id order by clock desc) as rn from table2') AS t2(id bigint, value numeric, clock timestamp , rn integer )

то возвращается:
ERROR: remote query result rowtype does not match the specified FROM clause rowtype
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объединение двух таблиц / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]