powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите реализовать запрос на PL\SQL!
25 сообщений из 31, страница 1 из 2
Помогите реализовать запрос на PL\SQL!
    #35695590
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица в фиксируются различные работы, в каждой строке есть дата и время начала и дата и время окончания.. Между временем окончания текущей и началом следующей есть промежутки. Подскажите пожалуйста как их высчитать. Сложности в том что данные над которыми надо проводить операции находятся в разных строках и столбцах. Может кто с таким сталкивался.. буду очень благодарен за помощь.
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695635
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Provider...

Первое что в голову пришло, соедините ету табличку саму с собой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select min(t2.date_start) - t1.data_end
from 
    table t1, table t2 
where 
   t1.fk=t2.fk 
   and t2.date_start > t1.data_end
group by t1.data_end
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695659
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как насчет того что дата окончания и дата начала которые необходима отнять находятся в соседних СТРОКАХ ?
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695664
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Providerа как насчет того что дата окончания и дата начала которые необходима отнять находятся в соседних СТРОКАХ ?

а разве соединением "from table t1, table t2 " мы не поместили их в одну и туже "виртуальную" строку ????
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695667
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тоесть от data_end одной строки надо отнять data_start следующей строки
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695673
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Providerтоесть от data_end одной строки надо отнять data_start следующей строки

можно и так , но результат окажется отрицательный ... в смысле с минусом. нужно будет ещё и знак менять.
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695708
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KRED, Вы немного неправильно меня поняли. Есть таблица:


--------------------------------------------------------------------------
I ..................I data_start I data_end I ............. I
--------------------------------------------------------------------------
I...................I 01.01.2008 13:45:12 I 01.01.2008 13:46:20 I ..............I
--------------------------------------------------------------------------
I...................I 01.01.2008 13:46:50 I 01.01.2008 13:47:35 I ..............I
--------------------------------------------------------------------------
.......................................................................

Вот мне надо по всем записям вычислить промежуток между data_end и data_start следующей строки.
(в примере это - 01.01.2008 13:46:20 - 01.01.2008 13:46:50 = 20сек) По преобразованию можно не писать, подскажите как организовать саму операцию.
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695725
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выше в примере ошибся, .... =30сек
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695760
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProviderKRED, Вы немного неправильно меня поняли. Есть таблица:


--------------------------------------------------------------------------
I ..................I data_start I data_end I ............. I
--------------------------------------------------------------------------
I...................I 01.01.2008 13:45:12 I 01.01.2008 13:46:20 I ..............I
--------------------------------------------------------------------------
I...................I 01.01.2008 13:46:50 I 01.01.2008 13:47:35 I ..............I
--------------------------------------------------------------------------
.......................................................................

Вот мне надо по всем записям вычислить промежуток между data_end и data_start следующей строки.
(в примере это - 01.01.2008 13:46:20 - 01.01.2008 13:46:50 = 20сек) По преобразованию можно не писать, подскажите как организовать саму операцию.

Вы наверное издеваетесь ??? я же вам дал пример использования !!! вы не въехали в тему и наежаете на меня что я не понял !!! Покажите пожалуста почему мой вариант решения НЕ РАБОТАЕТ !!!!
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695805
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на "min(t2.date_start) - t1.data_end" выдает ошибку "ORA-00937: not a single-group group function"
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695854
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Provider,

какой скл ты подсовываеш ??? покажи точный.

И Постгрес вообщето не даёт ошибок "ORA" :-)
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695858
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Providerна "min(t2.date_start - t1.data_end)" выдает ошибку "ORA-00937: not a single-group group function"а подумать
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695867
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KREDИ Постгрес вообщето не даёт ошибок "ORA" :-)этопять
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695876
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assaProviderна "min(t2.date_start - t1.data_end)" выдает ошибку "ORA-00937: not a single-group group function"а подумать

net ... min(t2.date_start - t1.data_end) нельзя ! нужно именно самую маленькую "t2.date_start" после t1.data_end
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695877
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KREDProvider...

Первое что в голову пришло, соедините ету табличку саму с собой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select min(t2.date_start) - t1.data_end
from 
    table t1, table t2 
where 
   t1.fk=t2.fk 
   and t2.date_start > t1.data_end
group by t1.data_end
гм. а кореллированным подзапросом с LIMIT 1 оптимизатору будет не проще?
болванки тут:
http://sql.ru/forum/actualthread.aspx?tid=619045
(слегка почистить от лишнего - будет то, что нужно)
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695881
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assa,

я не занимался оптимизацией его .... скорее нужно чем можно :-)
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695886
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KREDassaProviderна "min(t2.date_start - t1.data_end)" выдает ошибку "ORA-00937: not a single-group group function"а подумать

net ... min(t2.date_start - t1.data_end) нельзя ! нужно именно самую маленькую "t2.date_start" после t1.data_endчото сёня спю. не вчитывается.
да, вы правы.

там, у чела, групбай по t1.data_end не указан, чай.
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35695896
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assa,

авторгм. а кореллированным подзапросом с LIMIT 1 оптимизатору будет не проще?

пожет тот постгрес (который ORA кидает) сам разрулит такую ситуацию ???
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35696128
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KREDпожет тот постгрес (который ORA кидает) сам разрулит такую ситуацию ???могабыть пыжовый "энтерпрайс" уже дошел по части эмуляции оракла до выдачи ORA-льных сообщений?
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35696534
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрите в тему: "Помогите реализовать запрос на PL\SQL" я просил помочь по PL/SQL. Всем спасибо за советы. Я сделал все по-другому - с помощью функции LEAD. Работает замечательно.
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35696655
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProviderПосмотрите в тему: "Помогите реализовать запрос на PL\SQL" я просил помочь по PL/SQL. Всем спасибо за советы. Я сделал все по-другому - с помощью функции LEAD. Работает замечательно.

Покажи нам где в постгрестовой доке описании этой функции !

Очень хочется почитать.

Если быть ещо более точным ссылку с сайта www.postgresql.org приведи пожалуста.
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35697521
гыгыгы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Providerна "min(t2.date_start) - t1.data_end" выдает ошибку "ORA-00937 : not a single-group group function"
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35699210
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какой postgre? Я же написал - PL/SQL а не postgre SQL! Это разные вещи! А написал в этой ветки потому как ветки по PL/SQL просто нет... Вы че все читать не умеете?
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35699217
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот описание - http://www.adp-gmbh.ch/ora/sql/analytical/lag.html
...
Рейтинг: 0 / 0
Помогите реализовать запрос на PL\SQL!
    #35699241
Provider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KRED ты просил весь запрос сбросить? Вот -

select
w.fullname,
wt.descr type,
pr.name reason,
count(1) locations,
sum(od.packs) packs,
round(sum(od.packs)/count(1),2) packs_in_cells,
to_char(trunc(Sysdate) + sum(od.work_time)/(24 * 60 * 60), 'HH24:MI:SS') sum_time,
to_char(trunc(Sysdate) + (sum(od.work_time)/count(1))/(24 * 60 * 60), 'HH24:MI:SS') time_one_loc,
to_char(trunc(Sysdate) + (
case
when sum(od.packs)=0
then 0
else (sum(od.work_time)/sum(od.packs))
end
)/(24 * 60 * 60), 'HH24:MI:SS') time_one_pack
from
wms.oldpick_detail od, wms.oldpick ol, wms.pick_reason pr, wms.worker w, wms.work_type wt
where od.deleted > to_date('04.12.2008 09:00:00', 'DD.MM.YYYY HH24:MI:SS')
and od.deleted < to_date('04.12.2008 21:00:00', 'DD.MM.YYYY HH24:MI:SS')
and od.worker_id > 0
-- and ol.reason = 'order_picking'
and od.complete = 't'
and w.id=od.worker_id
and wt.name=od.opcode
and not (
od.opcode = 'ABSENCE'
or (ol.reason = 'order_picking'
and od.opcode = 'PICK')
)
-- and od.opcode in ('FROM_CNT', 'FROM_PAL')
and od.pick_id=ol.id
and pr.id=ol.reason
group by (w.fullname, wt.descr, pr.name)

union

select
w.fullname,
'Перемещение отобранной паллеты в ЕТ%' type,
pr.name reason,
count(1) locations,
sum(od.packs) packs,
round(sum(od.packs)/count(1),2) packs_in_cells,
to_char(trunc(Sysdate) + sum(od.work_time)/(24 * 60 * 60), 'HH24:MI:SS') sum_time,
to_char(trunc(Sysdate) + (sum(od.work_time)/count(1))/(24 * 60 * 60), 'HH24:MI:SS') time_one_loc,
to_char(trunc(Sysdate) + (
case
when sum(od.packs)=0
then 0
else (sum(od.work_time)/sum(od.packs))
end
)/(24 * 60 * 60), 'HH24:MI:SS') time_one_pack
from
wms_archive.oldpick_detail od, wms_archive.oldpick ol, wms.pick_reason pr, wms.worker w, wms.work_type wt
where od.deleted > to_date('04.12.2008 09:00:00', 'DD.MM.YYYY HH24:MI:SS')
and od.deleted < to_date('04.12.2008 21:00:00', 'DD.MM.YYYY HH24:MI:SS')
and od.worker_id > 0
and ol.reason = 'order_picking'
and od.opcode = 'PICK'
and od.complete = 't'
and od.order_id = 0
and w.id = od.worker_id
and wt.name = od.opcode
and od.pick_id = ol.id
and pr.id = ol.reason
group by (w.fullname, wt.descr, pr.name)

union

select
w.fullname,
'Перемещение монопаллеты в Е%' type,
pr.name reason,
count(1) locations,
sum(od.packs) packs,
round(sum(od.packs)/count(1),2) packs_in_cells,
to_char(trunc(Sysdate) + sum(od.work_time)/(24 * 60 * 60), 'HH24:MI:SS') sum_time,
to_char(trunc(Sysdate) + (sum(od.work_time)/count(1))/(24 * 60 * 60), 'HH24:MI:SS') time_one_loc,
to_char(trunc(Sysdate) + (
case
when sum(od.packs)=0
then 0
else (sum(od.work_time)/sum(od.packs))
end
)/(24 * 60 * 60), 'HH24:MI:SS') time_one_pack
from
wms_archive.oldpick_detail od, wms_archive.oldpick ol, wms.pick_reason pr, wms.worker w, wms.work_type wt
where od.deleted > to_date('04.12.2008 09:00:00', 'DD.MM.YYYY HH24:MI:SS')
and od.deleted < to_date('04.12.2008 21:00:00', 'DD.MM.YYYY HH24:MI:SS')
and od.worker_id > 0
and ol.reason = 'order_picking'
and od.opcode = 'PICK'
and od.complete = 't'
and od.order_id > 0
and w.id = od.worker_id
and wt.name = od.opcode
and od.pick_id = ol.id
and pr.id = ol.reason
group by (w.fullname, wt.descr, pr.name)

union

select
w.fullname,
'Перемещение S->S%' type,
pr.name reason,
count(1) locations,
sum(od.packs) packs,
round(sum(od.packs)/count(1),2) packs_in_cells,
-- lead (od.start_date,1, null) over (order by od.pick_id) d,
case when lead (od.pick_id,1) over (order by od.pick_id) = od.pick_id then
to_char(trunc(Sysdate) + (((lead (od.start_date,1) over (order by od.pick_id, od.start_date))-od.finish_date)), 'HH24:MI:SS')
else
to_char(trunc(Sysdate) + 0, 'HH24:MI:SS')
end sum_time,
to_char(trunc(Sysdate) + (sum(od.work_time)/count(1))/(24 * 60 * 60), 'HH24:MI:SS') time_one_loc,
to_char(trunc(Sysdate) + (
case
when sum(od.packs)=0
then 0
else (sum(od.work_time)/sum(od.packs))
end
)/(24 * 60 * 60), 'HH24:MI:SS') time_one_pack

from
wms_archive.oldpick_detail od, wms_archive.oldpick ol, wms.pick_reason pr, wms.worker w, wms.work_type wt
where od.deleted > to_date('04.12.2008 09:00:00', 'DD.MM.YYYY HH24:MI:SS')
and od.deleted < to_date('04.12.2008 21:00:00', 'DD.MM.YYYY HH24:MI:SS')
and od.worker_id > 0
and ol.reason = 'order_picking'
-- and od.opcode = 'PICK'
and od.complete = 't'
and (wt.name = 'FROM_CNT' or wt.name = 'FROM_PAL')
and od.order_id > 0
and w.id = od.worker_id
and wt.name = od.opcode
and od.pick_id = ol.id
and pr.id = ol.reason
group by w.fullname, wt.descr, pr.name, od.pick_id, od.start_date, od.finish_date

order by fullname
;
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите реализовать запрос на PL\SQL!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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