Добрый день, господа!
Есть у меня одна задача - учесть непрерывное время которое провел человек с накладными на руках:
У таблицы тривиальная структура:
ID_N - идентификатор накладной,
ID_U - идентификатор сотрудника,
DT_B - дата выдачи накладной,
DT_E - дата сдачи накладной
Интервалы пересекаются - то есть человек может взять три накладные, две сдать, одна на руках (причину любую на ваш вкус), взять еще одну... затем сдать обе.
Итак есть сырые данные:
Наклепал запрос
работает адски долго. видимо вложенные SELECT с агрегатными функциями тяжко даются. Вытащил самый сок, чтобы посмотреть что он выбирает:
а он не выбирает крайние накладные:
собственно хотелось бы получить начало и конец периода где накладные пересекаются, для наглядности:
Есть у меня одна задача - учесть непрерывное время которое провел человек с накладными на руках:
У таблицы тривиальная структура:
ID_N - идентификатор накладной,
ID_U - идентификатор сотрудника,
DT_B - дата выдачи накладной,
DT_E - дата сдачи накладной
Интервалы пересекаются - то есть человек может взять три накладные, две сдать, одна на руках (причину любую на ваш вкус), взять еще одну... затем сдать обе.
Итак есть сырые данные:
ID_WT ID_U DT_B DT_E 34531862 0 2018-09-27 05:12:37.000 2018-09-27 05:12:47.000 34531916 0 2018-09-27 05:11:18.000 2018-09-27 05:13:30.000 34531899 0 2018-09-27 05:09:11.000 2018-09-27 05:11:36.000 34531688 0 2018-09-27 05:08:13.000 2018-09-27 05:10:27.000 34531903 0 2018-09-27 05:07:32.000 2018-09-27 05:10:19.000
Наклепал запрос
select top 100 wt.id_u, CASE WHEN ( select min(wh.dt_b) from wh where wh.id_u = wt.id_u and wh.dt_b < wt.dt_b and wh.dt_e => wt.dt_b ) is null then wt.dt_b end as d_begin, (select max(wh.dt_e) from wh, where wh.id_u = wt.id_u and wh.dt_b > wt.dt_b and wh.dt_b <= wt.dt_e and wh.dt_e > wt.dt_e order by wh.id_u, wh.dt_b ) as d_end from wh wt order by id_u, d_begin
работает адски долго. видимо вложенные SELECT с агрегатными функциями тяжко даются. Вытащил самый сок, чтобы посмотреть что он выбирает:
select distinct wh.* from wh, wh wt where wh.id_u = wt.id_u and wh.dt_b > wt.dt_b and wh.dt_b <= wt.dt_e and wh.dt_e > wt.dt_e order by wh.id_u, wh.dt_b
а он не выбирает крайние накладные:
ID_WT ID_U DT_B DT_E 34531688 0 2018-09-27 05:08:13.000 2018-09-27 05:10:27.000 34531899 0 2018-09-27 05:09:11.000 2018-09-27 05:11:36.000 34531916 0 2018-09-27 05:11:18.000 2018-09-27 05:13:30.000
собственно хотелось бы получить начало и конец периода где накладные пересекаются, для наглядности:
