powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос
6 сообщений из 6, страница 1 из 1
Запрос
    #39126458
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите составить запрос:

есть таблица R:
a b c'12-10-2015' 10 5'12-11-2015' 9 6'12-12-2015' 8 7'12-01-2016' 10 6

таблица S:
d'3-12-2015''12-12-2015'

Требуется для каждого значения из таблицы S выбрать из таблицы R зачения b и c, с максимальным значением даты a, меньшим чем в таблицe S:
dabc'3-12-2015' '12-11-2015' 9 6'12-12-2015' '12-12-2015' 8 7

Есть предложение сделать через window-функцию:
Код: sql
1.
SELECT MAX(a), b, c FROM S LEFT JOIN R ON (s.d > r.a) OVER();



Но я плохо разбираюсь в механизме виндоу-функций, там еще какие-то причуды есть с использованием order by и partition внутри over. Может есть более простое решение, например с having

Код: sql
1.
SELECT a, b, c FROM S LEFT JOIN R ON(s.d > r.a) HAVING MAX(a)



?


--
Россия - отличная страна!
...
Рейтинг: 0 / 0
Запрос
    #39126490
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

если 9.3+, то проще всего через lateral. примерно так:

Код: sql
1.
2.
select d, a, b, c
from s, lateral (select a,b,c from r where r.a < s.d order by r.a desc limit 1) t
...
Рейтинг: 0 / 0
Запрос
    #39126497
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexiusPCContra,

если 9.3+, то проще всего через lateral. примерно так:

Код: sql
1.
2.
select d, a, b, c
from s, lateral (select a,b,c from r where r.a < s.d order by r.a desc limit 1) t



Да, у меня postgresql-9.4.5. Сейчас попробую))
...
Рейтинг: 0 / 0
Запрос
    #39126527
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот план:
QUERY PLAN

Nested Loop (cost=1.43..2.88 rows=2 width=16) (actual time=0.092..0.134 rows=2 loops=1)

CTE t

-> Unique (cost=0.05..0.06 rows=2 width=0) (actual time=0.049..0.050 rows=2 loops=1)

-> Sort (cost=0.05..0.06 rows=2 width=0) (actual time=0.048..0.048 rows=2 loops=1)

Sort Key: ('2015-12-11'::date)

Sort Method: quicksort Memory: 17kB

-> Append (cost=0.00..0.04 rows=2 width=0) (actual time=0.003..0.004 rows=2 loops=1)

-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.001 rows=1 loops=1)

-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.000..0.000 rows=1 loops=1)

-> CTE Scan on t (cost=0.00..0.04 rows=2 width=4) (actual time=0.051..0.055 rows=2 loops=1)

-> Limit (cost=1.37..1.37 rows=1 width=12) (actual time=0.036..0.036 rows=1 loops=2)

-> Sort (cost=1.37..1.39 rows=9 width=12) (actual time=0.035..0.035 rows=1 loops=2)

Sort Key: a.date

Sort Method: top-N heapsort Memory: 17kB

-> Seq Scan on remote a (cost=0.00..1.33 rows=9 width=12) (actual time=0.012..0.016 rows=14 loops=2)

Filter: (t.d > date)

Rows Removed by Filter: 13

Planning time: 0.723 ms
Execution time: 0.252 ms

Нормальный, не? нет ли тут тормозов типа "для каждой строчки первой таблицы мы просматриваем полностью вторую" ?
...
Рейтинг: 0 / 0
Запрос
    #39126697
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

есть, но для таблицы в 14 строк это не страшно. а так нужен индекс по date, если его еще нет, конечно.
...
Рейтинг: 0 / 0
Запрос
    #39127486
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё один вариант
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t4.*, t5.d
FROM R t4
JOIN (
SELECT max(t1.a) a, t2.s FROM R t1
JOIN S ON t1.a <= t2.d
GROUP BY t2.s ) t5 ON t4.a = t5.a



Необходимо учитывать, что если в таблицы R будут две одинаковые максимальные даты, то надо
придумать правило отбора требуемой записи, или получать две и более строк.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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