powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / интересный sql запрос
13 сообщений из 13, страница 1 из 1
интересный sql запрос
    #38978681
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблица px123268
таблица ty13730
надо получить итоговую таблицу sxy1123332367830
т.е. для каждого значения из таблицы p подобрать одно значение из таблицы t (наименьшее большее)
...
Рейтинг: 0 / 0
интересный sql запрос
    #38978707
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

вас вполне устроит кореллят.
или lateral -- если нужно не одно поле, а всю запись.
усё -- стандартное RTFM

ничего интересного в этом нет.
Интересно смотреть на планы для миллионных таблиц, и ковырять у носе с мысляме о высокомЪ, шпинделях, оборотах, и тапе.
но это другая история.
...
Рейтинг: 0 / 0
интересный sql запрос
    #38978831
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на примере? Запрос-то, в-общем, должен быть не сложный
...
Рейтинг: 0 / 0
интересный sql запрос
    #38978888
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraа на примере? Запрос-то, в-общем, должен быть не сложныйв ora-- форуме есть стандартное требование к заданию вопроса такого типа.

не помню точно, но основное:
напишите сами
1. источники данных
2. то как пытались

1. в нашем случае -- cte
Код: sql
1.
2.
3.
WITH t1 (t1id) AS (values((1),(2),(3),(4)....)
,t2 (t2id) AS (values((1),(2),(2),(7)....)
SELECT .....  


и т.п.

а только потом просите поправить ваш код.

так как все примеры есть в RTFM. что такое LATERAL -- можете тут в количествах найти. А писать рутину за вас -- тут никто не подряжался. Да и скучно это.
...
Рейтинг: 0 / 0
интересный sql запрос
    #38978932
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или полуджоин огруппировать.
...
Рейтинг: 0 / 0
интересный sql запрос
    #38979702
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пробовал так:
Код: sql
1.
2.
3.
WITH p(x) AS(VALUES (1), (2), (3), (2), (6), (8)),
t(y) AS (VALUES (1), (3), (7), (30))
SELECT * FROM p LEFT JOIN t ON (x <= y)


думал пройдет на шару, типа в таблице t значения идут в порядке убывания, и для джойна выберется первое наименьшее значение, удовлетворяющее условию. Фиг там, выбрались все.
Пробовал еще так, через функцию:
Код: sql
1.
2.
3.
CREATE FUNCTION func (INT, INT[]) RETURNS INT AS $$--где $2 = INT[] - массив ARRAY[1,3,7,30] (то что в таблице t), $1 = число
SELECT * FROM $2 WHERE $1 < ANY ($2) ORDER BY 1 DESC LIMIT 1
$$language sql;


Но т.к., походу, в пг не существует функции, которая бы возвращала из массива значение (в нашем случае - наименьшее большее значение, чем переменная $1 ), то я тут в ступоре. Тут надо думать, как выбрать из массива (FROM массив не катит), или массив сделать как табличку (как в первом посте) - я не знаю.
------------------
И да, кстати, мысли о высоком - это одно, а прикладные и, согласитесь, простые на первый взгляд задачи - бывают намного тяжелее и приносят больше пользы
...
Рейтинг: 0 / 0
интересный sql запрос
    #38979707
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraто я тут в ступоре.ещё раз
qwwqвсе примеры есть в RTFM. что такое LATERAL -- можете тут в количествах найтив частности, для решения вашей задачи в латерал-пример из факинмануала надо всего лишь дописать ордербай+лимит (ну и равенство на неравенство исправить)
...
Рейтинг: 0 / 0
интересный sql запрос
    #38979710
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraЯ пробовал так:
Код: sql
1.
2.
3.
WITH p(x) AS(VALUES (1), (2), (3), (2), (6), (8)),
t(y) AS (VALUES (1), (3), (7), (30))
SELECT * FROM p LEFT JOIN t ON (x <= y)


думал пройдет на шару, типа в таблице t значения идут в порядке убывания, и для джойна выберется первое наименьшее значение, удовлетворяющее условию. Фиг там, выбрались все.
Пробовал еще так, через функцию:
Код: sql
1.
2.
3.
CREATE FUNCTION func (INT, INT[]) RETURNS INT AS $$--где $2 = INT[] - массив ARRAY[1,3,7,30] (то что в таблице t), $1 = число
SELECT * FROM $2 WHERE $1 < ANY ($2) ORDER BY 1 DESC LIMIT 1
$$language sql;


Но т.к., походу, в пг не существует функции, которая бы возвращала из массива значение (в нашем случае - наименьшее большее значение, чем переменная $1 ), то я тут в ступоре. Тут надо думать, как выбрать из массива (FROM массив не катит), или массив сделать как табличку (как в первом посте) - я не знаю.
------------------
И да, кстати, мысли о высоком - это одно, а прикладные и, согласитесь, простые на первый взгляд задачи - бывают намного тяжелее и приносят больше пользы


1.
Код: plsql
1.
2.
3.
WITH p(x) AS(VALUES (1), (2), (3), (2), (6), (8)),
t(y) AS (VALUES (1), (3), (7), (30))
SELECT p.*, (SELECT min(t.y) FROM t where p.x<=t.y) FROM p;



2.
Код: plsql
1.
2.
3.
WITH p(x) AS(VALUES (1), (2), (3), (2), (6), (8)),
t(y) AS (VALUES (1), (3), (7), (30))
SELECT p.*, _t.* FROM p JOIN LATERAL (SELECT * FROM t WHERE p.x<=t.y ORDER BY t.y LIMIT 1) AS _t ON TRUE;



По скорости (и по сути) одинаково но первый работает только если у t 1 колонка а второй работает с любым количеством колонок у t.

PS: Если у p есть primary key то можно еще ваш LEFT JOIN доделать добавив min(t.x) + GROUP BY p.primary_key (но это менее эффективно по скорости будет).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
интересный sql запрос
    #38979748
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, Максим!

А через функцию, где второй параметр - это или массив, или табличка? Можно?
...
Рейтинг: 0 / 0
интересный sql запрос
    #38979763
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, так понимаю, там задача сводится либо к тому, как массив преобразовать к таблице (т.е. из массива сделать столбик значений), либо как выбрать значение из массива по условию (все тому же - наименьшее большее).

Это уже, в принципе, не нужно. Так, просто интресно
...
Рейтинг: 0 / 0
интересный sql запрос
    #38979814
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra<...>
в пг не существует функции, которая бы возвращала из массива значение<...>

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN;
CREATE OR REPLACE function arr_least(arr anyarray)
RETURNS anyelement
AS 
$$
SELECT min(u ) FROM (SELECT unnest(arr) u) foo;
$$ 
LANGUAGE sql;
SELECT arr_least (ARRAY[1,2,3,4,5,6,7,-1]);
-- -1
ROLLBACK;
...
Рейтинг: 0 / 0
интересный sql запрос
    #38979827
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraкак массив преобразовать к таблицеи ещё разqwwqвсе примеры есть в RTFM
http://www.postgresql.org/docs/9.2/static/functions-array.html - unnest
...
Рейтинг: 0 / 0
интересный sql запрос
    #38980015
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir, спасибо!
в pdf-версии написано 2 rows, там не сразу заметишь. Это то, что надо.
Максиму тоже спасибо!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / интересный sql запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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