Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2009, 18:49   #11
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
Восклицание

хм
я думал, что она решается сходу и опробовал свои же решения на тестовых данных, но в итоге стало ясно что не все так просто и решил поломать голову
в итоге вот что получилось
Код:
--alter session set NLS_DATE_FORMAT = 'DD.MM.YYYY HH24:MI:SS';

with
  t as
  (
  select 'Двиг111' name, to_date('20.01.2009 08:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг111' name, to_date('01.01.2009 01:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг111' name, to_date('01.01.2009 10:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг111' name, to_date('05.01.2009 11:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг111' name, to_date('05.01.2009 12:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг111' name, to_date('10.01.2009 10:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг111' name, to_date('10.01.2009 11:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг111' name, to_date('15.01.2009 10:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг222' name, to_date('05.01.2009 08:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг222' name, to_date('05.01.2009 10:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг222' name, to_date('05.01.2009 20:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг222' name, to_date('01.01.2009 07:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг222' name, to_date('01.01.2009 09:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 1 fValue from dual union all
  select 'Двиг222' name, to_date('01.01.2009 08:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг222' name, to_date('01.01.2009 11:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг222' name, to_date('02.01.2009 08:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг222' name, to_date('02.01.2009 10:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг222' name, to_date('05.01.2009 07:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг222' name, to_date('05.01.2009 09:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг222' name, to_date('05.01.2009 10:20:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг111' name, to_date('02.01.2009 08:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг111' name, to_date('02.01.2009 09:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг111' name, to_date('08.01.2009 08:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг111' name, to_date('08.01.2009 09:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual union all
  select 'Двиг111' name, to_date('08.01.2009 10:23:55', 'DD.MM.YYYY HH24:MI:SS') i_date, 0 fValue from dual
  ),  
  t2 as
  (
    select * from(
        select
        name name,
        i_date startdt,
        lead(i_date) over (order by name, i_date) enddt,
        fvalue
        from t
        order by name, i_date
    ) a
    where a.enddt is not null
  ),
  t3 as 
  (
    select t2.*,
    case
    when (lead(name) over (order by name, startdt) = name) and
    (lead(fvalue) over (order by name, startdt) = fvalue)
    then null
    else enddt
    end f_last
    from t2
    order by name, startdt
  )

select
  g.name, 
  min(g.startdt) StartDT,
  max(g.enddt) EndDT,  
  round((max(g.enddt) - min(g.startdt))*24*60*60) Period,
  g.fValue
from(
select
  b.*,
  case
    when f_last is null then
      (select c.f_last from t3 c where level =
          (select max(level) from t3 d 
           start with (d.enddt||d.fvalue||d.name) = (b.enddt||b.fvalue||b.name)
           connect by prior (d.enddt||d.fvalue||d.name) = (d.startdt||d.fvalue||d.name))
       start with (c.enddt||c.fvalue||c.name) = (b.enddt||b.fvalue||b.name)
       connect by prior (c.enddt||c.fvalue||c.name) = (c.startdt||c.fvalue||c.name))
    else
      f_last
  end f_last2
from t3 b) g
group by g.name, g.fValue, g.f_last2
order by 1, 2
З.Ы.: может быть кто-то и предложит более красивое решение и я заодно еще поглубже поизучаю аналитические функи
З.Ы.2: ясно, что решить задачу на ХП проще в 100 раз и в конкретно этом решении (если его привести к изначальному условию, а не этим тестовым данным) много будет зависеть от индексов в реальной таблице
soleil@mmc вне форума Ответить с цитированием
Старый 17.03.2012, 19:37   #12
asasin00
Новичок
Джуниор
 
Регистрация: 17.03.2012
Сообщений: 1
По умолчанию

Добрый день!!!Весь интернет обыскал,но не как не решу проблемку,очень надеюсь на помощь. Суть проблемы такова:
Есть БД в Access,в ней таблица "Сотрудники", и мне нужно создать запрос в Delphi с помощью которого я смогу вводить фамилию сотрудника, а мне выдавалась информация о написанном сотруднике!много разного пробовал но к оптимальному варианту так и не пришел!!Помогите пожалуйста)
asasin00 вне форума Ответить с цитированием
Старый 18.03.2012, 05:24   #13
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

А вы в курсе о правилах форума, которые гласят, что один вопрос - одна тема? В чужую тему не лезем.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с запросом Juries Microsoft Office Access 0 12.04.2009 00:29
Помогите с запросом Viper666 Microsoft Office Access 2 14.05.2008 22:35
Помогите с запросом Айвенго Microsoft Office Access 3 08.05.2008 09:07
Помогите с запросом Blackmore БД в Delphi 3 07.05.2008 01:18
помогите с запросом 9-11 БД в Delphi 4 20.11.2006 10:04