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

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

ничего интересного в этом нет.
Интересно смотреть на планы для миллионных таблиц, и ковырять у носе с мысляме о высокомЪ, шпинделях, оборотах, и тапе.
но это другая история.
...
Рейтинг: 0 / 0
08.06.2015, 11:58
    #38978831
PCContra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
а на примере? Запрос-то, в-общем, должен быть не сложный
...
Рейтинг: 0 / 0
08.06.2015, 12:41
    #38978888
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
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
08.06.2015, 13:10
    #38978932
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
или полуджоин огруппировать.
...
Рейтинг: 0 / 0
09.06.2015, 07:44
    #38979702
PCContra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
Я пробовал так:
Код: 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
09.06.2015, 08:06
    #38979707
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
PCContraто я тут в ступоре.ещё раз
qwwqвсе примеры есть в RTFM. что такое LATERAL -- можете тут в количествах найтив частности, для решения вашей задачи в латерал-пример из факинмануала надо всего лишь дописать ордербай+лимит (ну и равенство на неравенство исправить)
...
Рейтинг: 0 / 0
09.06.2015, 08:15
    #38979710
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
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
09.06.2015, 09:25
    #38979748
PCContra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
Спасибо, Максим!

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

Это уже, в принципе, не нужно. Так, просто интресно
...
Рейтинг: 0 / 0
09.06.2015, 10:26
    #38979814
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
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
09.06.2015, 10:30
    #38979827
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
PCContraкак массив преобразовать к таблицеи ещё разqwwqвсе примеры есть в RTFM
http://www.postgresql.org/docs/9.2/static/functions-array.html - unnest
...
Рейтинг: 0 / 0
09.06.2015, 12:09
    #38980015
PCContra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересный sql запрос
tanglir, спасибо!
в pdf-версии написано 2 rows, там не сразу заметишь. Это то, что надо.
Максиму тоже спасибо!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / интересный sql запрос / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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