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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2013, 12:00   #1
Pablo999
Новичок
Джуниор
 
Регистрация: 08.04.2013
Сообщений: 5
По умолчанию Отбор по периоду

Добрый всем день

У меня возникла следующая проблема,
У меня есть таблица R_OS_OWNERS с полями Data , Is_Actual,
carnumber! Is_Actual принимает значения 1 или 0, мне нужно чтобы отображались данные по периодам, когда Is_Actual равен 0.

примерчик
Таблица R_OS_OWNERS

Data Is_Actual carnumber
2012-01-01 00:00:00.000 1 333
2013-01-12 23:00:00.000 0 333
2013-03-25 00:00:00.000 1 333

таблица dl
Data2 Carnumber
04.01.2013 12:48:00 333
13.01.2013 22:44:00 333
23.01.2013 11:29:00 333
09.02.2013 6:15:14 333
22.02.2013 11:00:00 333
12.03.2013 22:33:00 333
18.03.2013 16:47:40 333
02.04.2013 18:03:40 333

Должно получиться вот так

04.01.2013 12:48:00 333
02.04.2013 18:03:40 333

Вот сам код
Код:
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,SourceStCode,DestStCode,ForeignSourceStCode,ForeignDestStCode,Code,Data, Is_actual,  
  row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl inner join qStation on SourceStCode = Code 
   inner join R_OS_OWNERS r on CarNumber=ID_OS  --and (SendDate is null or SendDate<SendDate) and SendDate>=DATA  
   where SendDate between '20130101'and '20130403' and ExpCode <> '88888888' and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0' 
 
and CarNumber= '50002963'
  
) 
select c1.InvNumber, c2.invnumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.SourceStCode, c1.DestStCode,c1.OutInfo,c1.Code,c1.ForeignSourceStCode,c1.ForeignDestStCode, c2.DestStCode as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1
where 
     c1.ForeignSourceStCode IS Not Null 
   and c1.ForeignDestStCode IS Not Null
   and  c2.ForeignDestStCode <> c1.ForeignSourceStCode
UNION
 select c1.InvNumber, c2.invnumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.SourceStCode, c1.DestStCode,c1.OutInfo,c1.Code,c1.ForeignSourceStCode,c1.ForeignDestStCode, c2.DestStCode as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1
where  
     c1.ForeignSourceStCode IS  Null 
   and c1.ForeignDestStCode IS  Null
   and  c2.DestStCode <> c1.SourceStCode  
order by c1.CarNumber

Последний раз редактировалось Stilet; 08.04.2013 в 12:04.
Pablo999 вне форума Ответить с цитированием
Старый 08.04.2013, 13:39   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. вычисляем подходящую дату-время (последняя дата изменения состояния за прошедшее время для указанного объекта)
последняя дата -> max(data_is_actual)
за прошедшее время -> where data_is_actual < data2)
для указанного объекта -> R_OS_OWNERS.carnumber =dl.carnumber
Код:
select data2, carnumer, ( select max(data_is_actual) from R_OS_OWNERS 
                          where data_is_actual<data2 and R_OS_OWNERS.carnumber =dl.carnumber
                        ) as statedate
from dl
2. к новой "таблице" вновь присоединяем таблицу состояний и отбираем нужное
Код:
select data2, carnnumber
from ( select data2, carnumer, ( select max(data_is_actual) from R_OS_OWNERS 
                                 where data_is_actual<data2 data_is_actual<data2 and R_OS_OWNERS.carnumber =dl.carnumber
                               ) as statedate 
       from dl ) as jurnal
left join R_OS_OWNERS on statedate=data_is_actual
where state=1
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 08.04.2013, 14:09   #3
Pablo999
Новичок
Джуниор
 
Регистрация: 08.04.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
1. вычисляем подходящую дату-время (последняя дата изменения состояния за прошедшее время для указанного объекта)
последняя дата -> max(data_is_actual)
за прошедшее время -> where data_is_actual < data2)
для указанного объекта -> R_OS_OWNERS.carnumber =dl.carnumber
Код:
select data2, carnumer, ( select max(data_is_actual) from R_OS_OWNERS 
                          where data_is_actual<data2 and R_OS_OWNERS.carnumber =dl.carnumber
                        ) as statedate
from dl
2. к новой "таблице" вновь присоединяем таблицу состояний и отбираем нужное
Код:
select data2, carnnumber
from ( select data2, carnumer, ( select max(data_is_actual) from R_OS_OWNERS 
                                 where data_is_actual<data2 data_is_actual<data2 and R_OS_OWNERS.carnumber =dl.carnumber
                               ) as statedate 
       from dl ) as jurnal
left join R_OS_OWNERS on statedate=data_is_actual
where state=1
Спасибо вам за ответ, не могли бы вы помочь присобачить к моему коду Что то не получается....((( Огромное вам спасибо! И еще не понял, что за data_is_actual, это же разные столбцы...
Pablo999 вне форума Ответить с цитированием
Старый 08.04.2013, 14:20   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

evg_m в задаче спрашивается совсем другое
надо отобрать записи из dl у которых дата в интервале от 2013-01-12 23:00:00.000 0 333 и до 2013-03-25 00:00:00.000 1 333 (или до сейчас если нет записей) из R_OS_OWNERS
eval вне форума Ответить с цитированием
Старый 08.04.2013, 14:33   #5
Pablo999
Новичок
Джуниор
 
Регистрация: 08.04.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
evg_m в задаче спрашивается совсем другое
надо отобрать записи из dl у которых дата в интервале от 2013-01-12 23:00:00.000 0 333 и до 2013-03-25 00:00:00.000 1 333 (или до сейчас если нет записей) из R_OS_OWNERS
Практически так, только надо отобрать записи где is_actual = 1 то есть в данном примере попадают 2 записи

04.01.2013 12:48:00 333
02.04.2013 18:03:40 333

промежуток с 2013-01-12 23:00:00.000 0 333 по 2013-03-25 00:00:00.000 1 333 мы исключаем
Pablo999 вне форума Ответить с цитированием
Старый 08.04.2013, 14:46   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
мне нужно чтобы отображались данные по периодам, когда Is_Actual равен 0
Цитата:
только надо отобрать записи где is_actual = 1
как тебя понимать, саид? (с)
eval вне форума Ответить с цитированием
Старый 08.04.2013, 14:54   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
evg_m в задаче спрашивается совсем другое
Код:
Data2 Carnumber           ( select max(data)             where data < data2    )  LEFT JOIN      is_actual
04.01.2013 12:48:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <04.01.2013    = 2012-01-01 -->1 
13.01.2013 22:44:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <13.01.2013    = 2013-01-12 -->0 
23.01.2013 11:29:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <23.01.2013    = 2013-01-12 -->0
09.02.2013 06:15:14 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <09.02.2013    = 2013-01-12 -->0
22.02.2013 11:00:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <22.02.2013    = 2013-01-12 -->0
12.03.2013 22:33:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <12.03.2013    = 2013-01-12 -->0
18.03.2013 16:47:40 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <18.03.2013    = 2013-01-12 -->0
02.04.2013 18:03:40 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <02.04.2013    = 2013-03-25 -->1
where is_actual=1
Код:
04.01.2013 12:48:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <04.01.2013 = 2012-01-01 -->1 
02.04.2013 18:03:40 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <02.04.2013 = 2013-03-25 -->1
Цитата:
Должно получиться вот так

04.01.2013 12:48:00 333
02.04.2013 18:03:40 333
Цитата:
И еще не понял, что за data_is_actual, это же разные столбцы...
надо читать так
Код:
select max(data) from R_OS_OWNERS 
                          where data<data2
Код:
select data2, carnnumber
from ( select data2, carnumer, ( select max(data) from R_OS_OWNERS 
                                 where data<data2 and R_OS_OWNERS.carnumber =dl.carnumber
                               ) as statedate 
       from dl ) as jurnal
left join R_OS_OWNERS on statedate=data
where is_actual=1
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.04.2013 в 15:02.
evg_m вне форума Ответить с цитированием
Старый 08.04.2013, 15:00   #8
Pablo999
Новичок
Джуниор
 
Регистрация: 08.04.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
как тебя понимать, саид? (с)
Где 1, описался) , исключаем период где 0
Pablo999 вне форума Ответить с цитированием
Старый 08.04.2013, 15:03   #9
Pablo999
Новичок
Джуниор
 
Регистрация: 08.04.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
Data2 Carnumber           ( select max(data)             where data < data2    )  LEFT JOIN      is_actual
04.01.2013 12:48:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <04.01.2013    = 2012-01-01 -->1 
13.01.2013 22:44:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <13.01.2013    = 2013-01-12 -->0 
23.01.2013 11:29:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <23.01.2013    = 2013-01-12 -->0
09.02.2013 06:15:14 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <09.02.2013    = 2013-01-12 -->0
22.02.2013 11:00:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <22.02.2013    = 2013-01-12 -->0
12.03.2013 22:33:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <12.03.2013    = 2013-01-12 -->0
18.03.2013 16:47:40 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <18.03.2013    = 2013-01-12 -->0
02.04.2013 18:03:40 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <02.04.2013    = 2013-03-25 -->1
where is_actual=1
Код:
04.01.2013 12:48:00 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <04.01.2013 = 2012-01-01 -->1 
02.04.2013 18:03:40 333  -> max(2012-01-01, 2013-01-12, 2013-03-25) <02.04.2013 = 2013-03-25 -->1

надо читать так
Код:
select max(data) from R_OS_OWNERS 
                          where data<data2
Код:
select data2, carnnumber
from ( select data2, carnumer, ( select max(data) from R_OS_OWNERS 
                                 where data<data2 and R_OS_OWNERS.carnumber =dl.carnumber
                               ) as statedate 
       from dl ) as jurnal
left join R_OS_OWNERS on statedate=data
where is_actual=1
Спасибо за подробный ответ, очень вас прошу помочь вставить в мою конструкцию! Пожалуйста...
Pablo999 вне форума Ответить с цитированием
Старый 08.04.2013, 15:47   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

evg_m на этих данных вам просто повезло, добавьте в R_OS_OWNERS еще запись, например 2013-03-30 00:00:00.000, 0, 333, и полетело все
eval вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
фильтр данных по указанному периоду в dbgrid Maxvella БД в Delphi 13 17.01.2014 15:48
отбор по критерию ggod БД в Delphi 1 21.02.2012 01:26
СУММЕСЛИМН с выбором по периоду Egor73 Microsoft Office Excel 3 18.12.2010 20:54
как можно привязать сопирование к временному периоду? zander Microsoft Office Excel 1 12.02.2009 12:44
Сортировка по периоду Proton-x Microsoft Office Excel 13 08.12.2008 08:49