powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблема с JOIN в postgres
20 сообщений из 20, страница 1 из 1
проблема с JOIN в postgres
    #38508818
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! есть 2 таблицы table1 и table2, вычисляю временное пересечение путем запроса select distinct table1.login, table1.timeby, table1.timesell, table1.selection, table2.login, table2.timeby, table2.timesell, table2.selection from table1 left OUTER JOIN table2 ON (table1.timeby<table2.timesell and table1.timesell>table2.timeby) order by table1.timeby, table2.timeby;
содержание 1 таблицы

login | timeby | timesell | selection |

LA | 2012-11-02 7:20:00 | 2012-11-02 7:30:00
HJ | 2012-11-02 7:40:00 | 2012-11-02 7:46:00
LR | 2012-11-02 7:50:00 | 2012-11-02 7:57:00

содержание 2 таблицы

login | timeby | timesell | selection |

LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00
KK | 2012-11-02 8:30:00 | 2012-11-02 9:00:00
RR | 2012-11-02 9:50:00 | 2012-11-02 10:57:00

Итог:

LA | 2012-11-02 7:20:00 | 2012-11-02 7:30:00 | | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 |2|
HJ | 2012-11-02 7:40:00 | 2012-11-02 7:46:00 | | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 |2 |
LR | 2012-11-02 7:50:00 | 2012-11-02 7:57:00 | | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 | 2 |
*****************************************************| KK | 2012-11-02 8:30:00 | 2012-11-02 9:00:00 | |
*****************************************************| RR | 2012-11-02 9:50:00 | 2012-11-02 10:57:00 | |

как видно на примере временной интервал | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 | | повторяется 3 раза, поскольку он пересекается с 3 временными интервалами LA | 2012-11-02 7:20:00 | 2012-11-02 7:30:00, HJ | 2012-11-02 7:40:00 | 2012-11-02 7:46:00, LR | 2012-11-02 7:50:00 | 2012-11-02 7:57:00

вопрос в следующем: при повторении интервала он повторяет и значение selection, как сделать их разными по соотношению к таблице1 ?

Помогите решить проблему
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38508834
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey19810,

вы бы чтоли привели какой ответ вам требуется...
база вам ответила строго то что вы запросили....
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38508997
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
у нас получается при запросе с join такой результат, где 00:20:00 повторяется столько раз, сколько отрезков входит в заданный интервал
LA | 2012-11-02 7:20:00 | 2012-11-02 7:30:00 | | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 |00:10:00|
HJ | 2012-11-02 7:40:00 | 2012-11-02 7:46:00 | | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 |00:10:00|
LR | 2012-11-02 7:50:00 | 2012-11-02 7:57:00 | | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 |00:10:00|
*****************************************************| KK | 2012-11-02 8:30:00 | 2012-11-02 9:00:00 | |
*****************************************************| RR | 2012-11-02 9:50:00 | 2012-11-02 10:57:00 | |


вот, что хотелось бы получить...подойдут любые варианты, уже и не знаю что делать

LA | 2012-11-02 7:20:00 | 2012-11-02 7:30:00 | | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 |00:10:00|
HJ | 2012-11-02 7:40:00 | 2012-11-02 7:46:00 | | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 |00:06:00|
LR | 2012-11-02 7:50:00 | 2012-11-02 7:57:00 | | LL | 2012-11-02 7:00:00 | 2012-11-02 8:30:00 |00:07:00|
*****************************************************| KK | 2012-11-02 8:30:00 | 2012-11-02 9:00:00 | |
*****************************************************| RR | 2012-11-02 9:50:00 | 2012-11-02 10:57:00 | |

получается что видимо мне нужно как то сохранить то что выдает join а потом использовать расчет времени пересечений...в моем варианте когда я сначала делаю расчет а потом join у меня выводятся повторения...и высчитывается неправильная сумма колонки selection...вобщем такая беда ((
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38509017
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey19810,

помогите пожалуйста
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38509815
andrey19810,

постановка вопроса очень сильно хромает. три раза прочитал, так и не понял, что тебе нужно...
Приведи внятный набор тестовых данных, желаемый результат на них и словесное описание алгоритма получения этого результата.
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38509853
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey19810,

добавьте к списку полей запроса: table1.timesell-table1.timeby
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38510221
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey19810,

если правильно понял задачу, то вам нужен DISTINCT ON (...) не забывая про ORDER BY
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38510984
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
частично решил задачу таким способом...но данных стало в среднем на 100 строк больше, если убрать distinct то строк вообще в 3 раза дольше...в данном примере считается динамическим способом колонка selection, повторений что были раньше уже нет, но запрос смотрится как то не изящно...как бы его сгруппировать, да и избавиться бы от лишних строк?

вот сам запрос


select distinct on (table1.login, table1.timeby, table1.timesell), (table2.timesell-table1.timeby) as selection, table2.login, table2.timeby, table2.timesell from sdd1 LEFT OUTER JOIN sdd2 ON (table1.timeby=table2.timeby and table1.timesell=table2.timesell) where (table1.timeby>='2012-10-01 00:00:00' and table1.timesell<='2012-10-31 00:00:00') union

select distinct table1.login, table1.timeby, table1.timesell, (table2.timesell-table1.timeby) as selection, table2.login, table2.timeby, table2.timesell from sdd1 LEFT OUTER JOIN sdd2 ON (table1.timeby<table2.timesell and table1.timesell>table2.timeby and table2.timesell>table1.timeby and table2.timesell<table1.timesell) where table1.timeby>='2012-10-01 00:00:00' and table1.timesell<='2012-10-31 00:00:00' union

select distinct table1.login, table1.timeby, table1.timesell, (table1.timesell-table2.timeby) as selection, table2.login, table2.timeby, table2.timesell from sdd1 LEFT OUTER JOIN sdd2 ON (table1.timeby<table2.timesell and table1.timesell>table2.timeby and table2.timeby<table1.timesell and table2.timesell>table1.timesell) where table1.timeby>='2012-10-01 00:00:00' and table1.timesell<='2012-10-31 00:00:00' order by 2, 3, 4, 5 ;
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511055
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey19810,

молодой человек, вам надо не про число строк рассуждать, а задачу ставить
хотя бы в терминах предметной области, раз неспособны к иному

или, если уж в терминах полей и записей - то какое множество записей, с какими параметрами этого множества вы хотели бы получить.

осмысление задачи - более половины решения. (обычно - процентов 90-95)

а уж как осмысленную задачу реализовать - это дело, как правило, десятое. в смысле- не составляет труда записать в SQL-выражениях (со всеми сопутствующими случаю оптимизациями и т.п.).
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511090
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

есть 2 таблицы table1 и table2 мне нужно найти пересечение временных интервалов между двумя таблицами...пересечения найти просто, но они могут быть не одного типа, а нескольких...я пытаюсь свести все условия возможных пересечений в одно универсальное, более понятное...
в файле outputunion2 то, что я имею сейчас, а в файле byhand, то что мне хотелось бы получить при автоматическом выводе(щас кое что приходить в ручную считать)
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511092
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511117
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey19810qwwq,

есть 2 таблицы table1 и table2 мне нужно найти пересечение временных интервалов между двумя таблицами...<blahblahblah>
низачот
попробуйте ещё раз

"пересечение временных интервалов" - это не множество, и не его описатель. это какая-то малая (возможно существенная) часть задачи.

напишите
Код: plaintext
1.
"множество записей,  такое, что .....[полный перечень признаков
.... характеризующееся, в частности, тем, что наличествует пересечение, такое, что .....]"

- и попробуйте удостовериться, что формулировка полна



насколько я понял (телепатируя) ,вам нужно для каждой записи таблицы 1 вернуть не более одной записи таблицы 2, такой что (что-то про пересечение, и приоритет выборки при множественном возврате)

-- возможно, я понял неправильно.
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511146
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
least(table1.timesell, table2.timesell) - greatest(table1.timeby, table2.timeby)
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511206
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBatleast(table1.timesell, table2.timesell) - greatest(table1.timeby, table2.timeby)

агонь! аплодирую стоя!!! только считается все и те отрезки что входят в пересечения и нет, как бы сделать так что бы считались только варианты с пересечением? вот основной запрос

select distinct table1.login, table1.timeby, table1.timesell, (least(table1.timesell, table2.timesell) - greatest(table1.timeby, table2.timeby)) as selection, table2.login, table2.timeby, table2.timesell from sdd1 full OUTER JOIN sdd2 ON (table1.timeby<table2.timesell and table1.timesell>table2.timeby) where (table1.timeby>='2012-10-01 00:00:00' and table1.timesell<='2012-10-31 00:00:00') order by table1.timeby, table1.timesell;
красным выделено условие пересечения
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511230
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а) выводить только строки с парой - убрать FULL OUTER

или

б) case when table1.login is not null and table2.login is not null then ... else null end

9.17. Conditional Expressions
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511234
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,
a) поменял full на left та же история, тут наверно нужно ставить условие пересечения до просчета selection

б) не могли бы вы показать куда мне ставить case в тело запроса? я пробовал по разному не получается
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511242
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey19810a) поменял full на left та же история, тут наверно нужно ставить условие пересечения до просчета selection
убрать. чтобы получился INNER

andrey19810б) не могли бы вы показать куда мне ставить case в тело запроса? я пробовал по разному не получается
в select-list

select case when table1.login is not null and table2.login is not null then least(table1.timesell, table2.timesell) - greatest(table1.timeby, table2.timeby) else null end ...
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511257
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,

БОЛЬШОЕ ТЕБЕ СПАСИБО! все работает как часы!
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38511271
andrey19810
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey19810,

а есть какие то мысли по поводу как нам рассчитать сумму времени колонки selection?
...
Рейтинг: 0 / 0
проблема с JOIN в postgres
    #38512159
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey19810andrey19810,

а есть какие то мысли по поводу как нам рассчитать сумму времени колонки selection?

select sum(a.selection) from (select ... as selection from ....) as a
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблема с JOIN в postgres
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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