powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / определить ближайшие min & max значения для заданного
18 сообщений из 18, страница 1 из 1
определить ближайшие min & max значения для заданного
    #35153587
Арсентий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, помогите корректо составить запрос следующей ф-ности:
есть некая таблица состояний объекта:

stateid|stateDate|state

где stateDate - дата изменения состояния объекта, state - новое значение состояния

необходимо, для произвольно заданной даты определить состояние этого объекта (точнее, состояние, в катором находился объект на произвольно заданую дату)

например, для
01.12.2006 - income
02.12.2006 - in_transfering
05.12.2006 - arrived
05.12.2006 - stored

для заданной даты 03.12.2006 - объект находится в состоянии in_transfering
когда же для 05.12.2006 - stored

Спасибо!
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35153677
Арсентий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...ну тогда хоть куда копать подскажите? я нет перерыл, но везде обычные between попадают,
давайте упростим:
как определить ближайшие min & max значения для заданного
то есть без всяких изменений состояния в один и тот же день, как это сделать, например, просто для последовательности:

заданное число: 15
ряд чисел: 1,2,8,10,22,25,45

мин и макс, для этого случая должно быть: 10 и 22 соотвественно...
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35153762
Арсентий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, ну что, никаких предложений??????
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35153861
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. В твоём примере есть 2 одинаковых даты - нехорошо... Добавляй ЕЩЁ признак, по которому их упорядочить. StateId?
2. Нужно одним SELECT'ом - или ХП подойдёт? вариантов решения - море...
3. Пример:
SELECT FIRST 1 state
FROM States
WHERE stateDate <= p_MyDate
ORDER BY
stateDate DESC
, stateid DESC
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35156690
Julian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select state from States
where stateid = (
select max(stateid) from States
where stateDate <= mdy(12,3,2006)
);
по идее, будет побыстрее.
В любом случае нужен индекс по stateDate.

--

select
(select max(num) from Num_List where num < 15) min_num,
(select min(num) from Num_List where num > 15) max_num
from systables
where tabid = 1;
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35156965
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Julian
по идее, будет побыстрее.
;не будет, медленнее.
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35159267
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой1. В твоём примере есть 2 одинаковых даты - нехорошо... Это не "нехорошо". Это плохо. Потому что при таких раскладах (изменение статуса чаще чем раз в день) сам по себе вопрос "Каков был статус заданного объекта на дату Х?" лишен смысла (в общем случае).
Арсентийнапример, для
01.12.2006 - income
02.12.2006 - in_transfering
05.12.2006 - arrived
05.12.2006 - stored

когда же для 05.12.2006 - storedЭто, скажите мне, откуда следует?!
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35159458
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денисне будет, медленнее.
Почему? Поиск максимума дороже сортировки по двум полям?
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35159595
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010 Журавлев Денисне будет, медленнее.
Почему? Поиск максимума дороже сортировки по двум полям?два захода в таблицу дороже чем один. Сортировки там не должно быть, в смысле у меня бы не было, проход по индексу с конца (наверно нужно +first_rows для верности, оптимизатор FIRST 1 не видит)
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35164661
Julian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или два захода (очень быстрые и легкие, кстати), или сортировка. Сортировка всегда хуже, и по количеству обращений к данным (индексу) проигрывает значительно. Директива вряд ли существенно поможет. Можно посмотреть план на какой-нибудь таблице, но вообще-то такая конструкция с некоррелированным подзапросом очень хорошо себя показывает, в моей практике по крайней мере. Если Вы говорите о каком-то третьем варианте - без сортировки и без подзапроса, то было бы интересно его показать.
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35166482
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulianИли два захода (очень быстрые и легкие, кстати), или сортировка. Сортировка всегда хуже, и по количеству обращений к данным (индексу) проигрывает значительно. Директива вряд ли существенно поможет. Можно посмотреть план на какой-нибудь таблице, но вообще-то такая конструкция с некоррелированным подзапросом очень хорошо себя показывает, в моей практике по крайней мере. Если Вы говорите о каком-то третьем варианте - без сортировки и без подзапроса, то было бы интересно его показать.Не ссорьтесь, горячие финские парни!!!
Погодите обсуждать технические детали. У человека серьезные проблемы с пониманием ситуации, а вы уже в тюнинг углубились!
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35166615
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ФадеевНе ссорьтесь, горячие финские парни!!!
Погодите обсуждать технические детали. У человека серьезные проблемы с пониманием ситуации, а вы уже в тюнинг углубились!Мы не ссоримся, мы просто пытаемся померить.
Топикстартер и его проблемы нам мало интересны, тем более он наверно все давно решил.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table curs(d date, val decimal( 20 , 2 ));

create procedure fill_curs(s integer);
  define i integer;
  define d0 date;
  let d0 = '01.01.2000';
  for i =  0  to s
  insert into curs values (d0,  24 );
  let d0=d0+ 1 ;
  end for;
end procedure;

execute procedure fill_curs( 100000 );

create unique index ixcurs on curs(d);

update statistics high for table curs;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
QUERY:
------
select /*+ explain */ first 1 d, val
from curs
where d <= '10.01.2003'
order by d desc

DIRECTIVES FOLLOWED: 
EXPLAIN 
DIRECTIVES NOT FOLLOWED: 

Estimated Cost: 54  и стоимость и кол-во возвращаемых строк неверны (я не знаю субд которые оценивают такой вариант правильно)
Estimated # of Rows Returned: 1106

  1) informix.curs: INDEX PATH

    (1) Index Keys: d   (Serial, fragments: ALL)
        Lower Index Filter: informix.curs.d <= 10.01.03 
никаких сортировок план идеален, этот запрос без сомнений быстрее.


QUERY:
------
select /*+ explain */ d, val
from curs
where d = (select max(d) from curs where d <= '10.01.2003')

DIRECTIVES FOLLOWED: 
EXPLAIN 
DIRECTIVES NOT FOLLOWED: 

Estimated Cost: 4
Estimated # of Rows Returned: 1

  1) informix.curs: INDEX PATH

    (1) Index Keys: d   (Serial, fragments: ALL)
        Lower Index Filter: informix.curs.d = <subquery> 

    Subquery:
    ---------
    Estimated Cost: 3
    Estimated # of Rows Returned: 1

      1) informix.curs: INDEX PATH

        (1) Index Keys: d   (Key-Only)  (Aggregate)  (Serial, fragments: ALL)
            Lower Index Filter: informix.curs.d <= 10.01.03 


Проблема в том, что лишь последние версии информикса позволяют first в подзапросах.


Да и еще: своим программерам я рекомендую делать два поля дата_начала(default 0101001) и дата_конца(31129999), нужна конечно проверка непересекаемости периодов, но запросы становятся красивее between. Вообще можно сделать вью и instead of триггер который будет заполнять дата_конца.
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35166947
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис
Код: plaintext
1.
2.
3.
4.
5.
6.
  let d0 = '01.01.2000';
  for i =  0  to s
  insert into curs values (d0,  24 );
  let d0=d0+ 1 ;
...
execute procedure fill_curs( 100000 );

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
QUERY:
------
select /*+ explain */ first 1 d, val
from curs
where d <= '10.01.2003'
order by d desc

Estimated Cost: 54  и стоимость и кол-во возвращаемых строк неверны (я не знаю субд которые оценивают такой вариант правильно)

Estimated # of Rows Returned: 1106

Я , наверное, глючу, но именно 1106 строк и должно вернуться исходя из твоих условий ? (first 1 ведь будет применено только в конце, для готовой выборки ?)
И как ты определил неверность стоимости (этих условных "попугаев") ?
Индексные и табличные страницы то читать нужно (key only нет).

Журавлев Денис
Код: plaintext
1.
2.
3.
4.
  1) informix.curs: INDEX PATH
    (1) Index Keys: d   (Serial, fragments: ALL)
        Lower Index Filter: informix.curs.d <= 10.01.03 
никаких сортировок план идеален, этот запрос без сомнений быстрее.

Я правильно понял, что этот коммент относится к первому запросу ?
Мне он идеальным не показался.
А вот второй кажется значительно быстрее :)
А как все таки на практике на разных версиях ?
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35166978
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев ДенисДа и еще: своим программерам я рекомендую делать два поля дата_начала(default 0101001) и дата_конца(31129999), нужна конечно проверка непересекаемости периодов, но запросы становятся красивее between. Вообще можно сделать вью и instead of триггер который будет заполнять дата_конца.Это называется темпоральная модель. Именно для таких случаев и используется. Только, возвращаясь к началу, у автора большие проблемы именно в постановке (там до решения далеко еще).
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35167167
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilis
Я , наверное, глючу, но именно 1106 строк и должно вернуться исходя из твоих условий ? (first 1 ведь будет применено только в конце, для готовой выборки ?)
Спустится по индексу 3, сходит в таблицу 1, стоп-конец.

vasilis
И как ты определил неверность стоимости (этих условных "попугаев") ?
Индексные и табличные страницы то читать нужно (key only нет).
IMHO: Его стоимость 3+1=4, строк вернется 1.


vasilisЯ правильно понял, что этот коммент относится к первому запросу ?
Мне он идеальным не показался.
А вот второй кажется значительно быстрее :)
А как все таки на практике на разных версиях ?К первому там один шаг, один заход в таблицу, во втором случае два шага, стоимость 7.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create procedure test_curs1(s integer);
  define i integer;
  define d0 date;
  define v0 decimal( 20 , 2 );
  for i =  0  to s
     foreach 
     select first  1  d, val into d0, v0
     from curs
     where d <= '10.01.2003'
     order by d desc
     end foreach;
  end for;
end procedure;

create procedure test_curs2(s integer);
  define i integer;
  define d0 date;
  define v0 decimal( 20 , 2 );
  for i =  0  to s
    select d, val into d0, v0
    from curs
    where d = (select max(d) from curs where d <= '10.01.2003');
  end for;
end procedure;

> time echo "execute procedure test_curs1(100000);"|dbaccess a
real 0m4.566s
> time echo "execute procedure test_curs1(100000);"|dbaccess a
real 0m4.782s


> time echo "execute procedure test_curs2(100000);"|dbaccess a
real 0m8.160s
> time echo "execute procedure test_curs2(100000);"|dbaccess a
real 0m8.540s

Кто еще что хочет померять?
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35167224
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и что интересно, если сделать индекс по обоим полям, получим желаемый
Index Keys: d val (Key-Only)

Но временные показатели ухудшаются до 5 и 9.
Т.е. не стоит индексировать длинные поля типа decimal(20,2).
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35167228
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев ДенисТ.е. не стоит индексировать длинные поля типа decimal(20,2).
точнее мне при моих настройках в этом случае не стоит индексировать длинные поля типа decimal(20,2).
...
Рейтинг: 0 / 0
определить ближайшие min & max значения для заданного
    #35167461
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / определить ближайшие min & max значения для заданного
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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