|
|
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! есть 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 ? Помогите решить проблему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 15:11:42 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
andrey19810, вы бы чтоли привели какой ответ вам требуется... база вам ответила строго то что вы запросили.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 15:40:15 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
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...вобщем такая беда (( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 22:46:44 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
andrey19810, помогите пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 23:11:32 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
andrey19810, постановка вопроса очень сильно хромает. три раза прочитал, так и не понял, что тебе нужно... Приведи внятный набор тестовых данных, желаемый результат на них и словесное описание алгоритма получения этого результата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 12:23:56 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
andrey19810, добавьте к списку полей запроса: table1.timesell-table1.timeby ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 12:56:35 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
andrey19810, если правильно понял задачу, то вам нужен DISTINCT ON (...) не забывая про ORDER BY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 17:06:36 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
частично решил задачу таким способом...но данных стало в среднем на 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 ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 12:39:43 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
andrey19810, молодой человек, вам надо не про число строк рассуждать, а задачу ставить хотя бы в терминах предметной области, раз неспособны к иному или, если уж в терминах полей и записей - то какое множество записей, с какими параметрами этого множества вы хотели бы получить. осмысление задачи - более половины решения. (обычно - процентов 90-95) а уж как осмысленную задачу реализовать - это дело, как правило, десятое. в смысле- не составляет труда записать в SQL-выражениях (со всеми сопутствующими случаю оптимизациями и т.п.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 13:26:39 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
qwwq, есть 2 таблицы table1 и table2 мне нужно найти пересечение временных интервалов между двумя таблицами...пересечения найти просто, но они могут быть не одного типа, а нескольких...я пытаюсь свести все условия возможных пересечений в одно универсальное, более понятное... в файле outputunion2 то, что я имею сейчас, а в файле byhand, то что мне хотелось бы получить при автоматическом выводе(щас кое что приходить в ручную считать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 13:53:39 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
qwwq, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 13:54:12 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
andrey19810qwwq, есть 2 таблицы table1 и table2 мне нужно найти пересечение временных интервалов между двумя таблицами...<blahblahblah> низачот попробуйте ещё раз "пересечение временных интервалов" - это не множество, и не его описатель. это какая-то малая (возможно существенная) часть задачи. напишите Код: plaintext 1. - и попробуйте удостовериться, что формулировка полна насколько я понял (телепатируя) ,вам нужно для каждой записи таблицы 1 вернуть не более одной записи таблицы 2, такой что (что-то про пересечение, и приоритет выборки при множественном возврате) -- возможно, я понял неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 14:15:21 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
least(table1.timesell, table2.timesell) - greatest(table1.timeby, table2.timeby) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 14:31:00 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
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; красным выделено условие пересечения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 15:18:54 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
а) выводить только строки с парой - убрать FULL OUTER или б) case when table1.login is not null and table2.login is not null then ... else null end 9.17. Conditional Expressions ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 15:44:20 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat, a) поменял full на left та же история, тут наверно нужно ставить условие пересечения до просчета selection б) не могли бы вы показать куда мне ставить case в тело запроса? я пробовал по разному не получается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 15:48:37 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
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 ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 15:55:29 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat, БОЛЬШОЕ ТЕБЕ СПАСИБО! все работает как часы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 16:05:50 |
|
||
|
проблема с JOIN в postgres
|
|||
|---|---|---|---|
|
#18+
andrey19810, а есть какие то мысли по поводу как нам рассчитать сумму времени колонки selection? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 16:14:52 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38511146&tid=1998926]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
203ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
86ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 552ms |

| 0 / 0 |
