Запрос

rrm
Дата: 16.11.2008 11:27:59
Есть таблица со следующими полями:
Nrec (NUMBER)
data1 (DATETIME)
status (NUMBER)

поле status может содержать следующие значения: 1,2 или 3.
С течением времени статусы для одного значения Nrec могут меняться,
инфа вносится в эту таблицу.
Помогите, плз, написать запрос.
Нужны все значения поля Nrec на определенный момент времени,
имеющие на тот момент определенный статус.
semenar
Дата: 16.11.2008 12:19:59
select nrec from table_name where data1=... and status=....
rrm
Дата: 16.11.2008 12:51:53
Примеры данных и результатов выборки
Nrec data1 status
17 14.09.2008 12:40 1
17 14.09.2008 12:45 2
18 14.09.2008 12:49 1

Выборка с параметрами data1=14.09.2008 12:47, status=1 должна быть пустой,
т.к. на тот момент не было Nrec со статусом 1
с параметрами data1=14.09.2008 12:47, status=2 должна вернуть значение 17
с параметрами data1=14.09.2008 12:51, status=1 должна вернуть значение 18
Denis Popov
Дата: 16.11.2008 13:49:15

SQL> create or replace view VI_TMP as
   2  select Nrec
   3       , data1
   4       , lead (data1) over (order by data1) lead_data1
   5       , status
   6  from (select 17 Nrec, to_date('14.09.2008 12:40', 'dd.mm.yyyy hh24:mi') data1, 1 status from 
DUAL union all
   7        select 17 Nrec, to_date('14.09.2008 12:45', 'dd.mm.yyyy hh24:mi') data1, 2 status from 
DUAL union all
   8        select 18 Nrec, to_date('14.09.2008 12:49', 'dd.mm.yyyy hh24:mi') data1, 1 status from DUAL
   9       )
  10  /

View created.

SQL> --Выборка с параметрами data1=14.09.2008 12:47, status=1 должна быть пустой, т.к. на тот момент 
не было Nrec со статусом 1
SQL> select Nrec
   2  from VI_TMP
   3  where to_date('14.09.2008 12:47', 'dd.mm.yyyy hh24:mi') >= data1
   4    and (lead_data1 is null or to_date('14.09.2008 12:47', 'dd.mm.yyyy hh24:mi') < lead_data1)
   5    and status = 1;

no rows selected

SQL> --с параметрами data1=14.09.2008 12:47, status=2 должна вернуть значение 17
SQL> select Nrec
   2  from VI_TMP
   3  where to_date('14.09.2008 12:47', 'dd.mm.yyyy hh24:mi') >= data1
   4    and (lead_data1 is null or to_date('14.09.2008 12:47', 'dd.mm.yyyy hh24:mi') < lead_data1)
   5    and status = 2;

       NREC
----------
         17

1 row selected.

SQL> --с параметрами data1=14.09.2008 12:51, status=1 должна вернуть значение 18
SQL> select Nrec
   2  from VI_TMP
   3  where to_date('14.09.2008 12:51', 'dd.mm.yyyy hh24:mi') >= data1
   4    and (lead_data1 is null or to_date('14.09.2008 12:51', 'dd.mm.yyyy hh24:mi') < lead_data1)
   5    and status = 1;

       NREC
----------
         18

1 row selected.

Posted via ActualForum NNTP Server 1.4

rrm
Дата: 17.11.2008 07:12:45
Еще пример
Nrec data1 status
17 14.09.2008 12:40 1
17 14.09.2008 12:45 2
18 14.09.2008 12:49 1
17 14.09.2008 12:51 1
19 14.09.2008 12:54 1
18 14.09.2008 12:46 3
17 14.09.2008 12:58 2

Запрос с параметрами data1=14.09.2008 12:53, status=1 должен вернуть 2 значения: 17,18.

Могу объяснить то что мне нужно на примере такой задачки. Есть 15 светофоров, которые могут поменять цвет (на любой другой) в любой момент времени, на неопределенный промежуток времени, при этом создается запись в таблице: ID светофора, дата/время, цвет (статус).
Мне нужно знать в какой-то определенный момент на каких светофорах горел, к примеру, зеленый.
Добрый Э - Эх
Дата: 17.11.2008 07:27:53
-- Тестовые данные:
with t as (
select 17 as Nrec, to_date('14.09.2008 12:40','dd.mm.yyyy hh24:mi:ss') as data1, 1 as status from dual union all
select 17 as Nrec, to_date('14.09.2008 12:45','dd.mm.yyyy hh24:mi:ss') as data1, 2 as status from dual union all
select 18 as Nrec, to_date('14.09.2008 12:49','dd.mm.yyyy hh24:mi:ss') as data1, 1 as status from dual union all
select 17 as Nrec, to_date('14.09.2008 12:51','dd.mm.yyyy hh24:mi:ss') as data1, 1 as status from dual union all
select 19 as Nrec, to_date('14.09.2008 12:54','dd.mm.yyyy hh24:mi:ss') as data1, 1 as status from dual union all
select 18 as Nrec, to_date('14.09.2008 12:46','dd.mm.yyyy hh24:mi:ss') as data1, 3 as status from dual union all
select 17 as Nrec, to_date('14.09.2008 12:58','dd.mm.yyyy hh24:mi:ss') as data1, 2 as status from dual)
--
--
-- Запрос:
-- :status = 1;   :data1 = '14.09.2008 12:53:00'
select *
  from (
         select t.*,
                lead(data1) over(partition by nrec order by data1) as data2
           from t
       )
 where to_date(:data1, 'dd.mm.yyyy hh24:mi:ss') >= data1
   and (to_date(:data1, 'dd.mm.yyyy hh24:mi:ss') < data2 or data2 is null)
   and status = :status

Query finished, retrieving results...

NREC          DATA1           STATUS          DATA2
----   --------------------   ------   --------------------
  17   14-сен-2008 12:51:00        1   14-сен-2008 12:58:00
  18   14-сен-2008 12:49:00        1

2 row(s) retrieved
rrm
Дата: 17.11.2008 08:57:39
Спасибо!