Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблема с JOIN в postgres / 20 сообщений из 20, страница 1 из 1
21.12.2013, 15:11:42
    #38508818
andrey19810
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
Здравствуйте! есть 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
21.12.2013, 15:40:15
    #38508834
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
andrey19810,

вы бы чтоли привели какой ответ вам требуется...
база вам ответила строго то что вы запросили....
...
Рейтинг: 0 / 0
21.12.2013, 22:46:44
    #38508997
andrey19810
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
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
21.12.2013, 23:11:32
    #38509017
andrey19810
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
andrey19810,

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

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

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

если правильно понял задачу, то вам нужен DISTINCT ON (...) не забывая про ORDER BY
...
Рейтинг: 0 / 0
24.12.2013, 12:39:43
    #38510984
andrey19810
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
частично решил задачу таким способом...но данных стало в среднем на 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
24.12.2013, 13:26:39
    #38511055
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
andrey19810,

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

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

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

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

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

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

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

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

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



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

-- возможно, я понял неправильно.
...
Рейтинг: 0 / 0
24.12.2013, 14:31:00
    #38511146
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
least(table1.timesell, table2.timesell) - greatest(table1.timeby, table2.timeby)
...
Рейтинг: 0 / 0
24.12.2013, 15:18:54
    #38511206
andrey19810
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
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
24.12.2013, 15:44:20
    #38511230
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
а) выводить только строки с парой - убрать 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
24.12.2013, 15:48:37
    #38511234
andrey19810
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
LeXa NalBat,
a) поменял full на left та же история, тут наверно нужно ставить условие пересечения до просчета selection

б) не могли бы вы показать куда мне ставить case в тело запроса? я пробовал по разному не получается
...
Рейтинг: 0 / 0
24.12.2013, 15:55:29
    #38511242
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
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
24.12.2013, 16:05:50
    #38511257
andrey19810
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с JOIN в postgres
LeXa NalBat,

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

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

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

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


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