powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Помогите написать запрос, пожалуйста..
16 сообщений из 41, страница 2 из 2
Помогите написать запрос, пожалуйста..
    #34871338
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев СергейА что, в Informix-е строки сравнивать между собой нельзя?
Конечно же можно.
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34871736
zenk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если несколько товаров дали в один день одну и ту же выручку?

Я не нашёл, где надо построить отчёт - в разрабатываемом приложении или в отчётной системе?
Если первое, то проблем с использованием временных таблиц быть не должно.
Если товаров сотни тысяч наименований, я бы написал примерно так:

Код: 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.
--Тут должны отловить ошибку "Таблица не существует"
DROP TABLE tmp_rank1;
CREATE TEMP TABLE tmp_rank1
          (t_from INT,
           t_date DATE,
           t_kod INT,
           t_sum DECIMAL( 13 , 2 ),
           my_rank SMALLINT)
WITH NO LOG;

INSERT INTO tmp_rank1
(SELECT DISTINCT t_from, t_date, t_kod, t_sum,  0 
 FROM s_total
 WHERE t_date BETWEEN (TODAY -  31  UNITS DAY) AND (TODAY));

CREATE INDEX tmp_rank1_i1 ON tmp_rank(t_from, t_date, t_sum);
UPDATE STATISTICS HIGH FOR TABLE tmp_rank1;

DROP TABLE tmp_rank2;
CREATE TEMP TABLE tmp_rank2
          (t_from INT,
           t_date DATE,
           t_sum DECIMAL( 13 , 2 ),
WITH NO LOG;

INSERT INTO tmp_rank2
(SELECT DISTINCT t_from, t_date, t_sum
  FROM tmp_rank1);

CREATE INDEX tmp_rank2_i1 ON tmp_rank2(t_from, t_date, t_sum);
UPDATE STATISTICS HIGH FOR TABLE tmp_rank2;

UPDATE tmp_rank1
SET Rank=(SELECT Count(*)
               FROM tmp_rank2
               WHERE tmp_rank1.t_from =  tmp_rank2.t_from
                   AND tmp_rank1.t_date = tmp_rank2.t_date
                   AND tmp_rank1.t_sum >=  tmp_rank2.t_sum);
               

Извините, если где-то ошибки в синтаксисе.
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34871818
Cold bringer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иэх, господа - это всё здорово, но такие запросы не возвращают результата. Запрос отсылается на сервер, в течении семидесяти минут не было ответа - потом я выключил. Обрабатывал пять дней, записей в таблице за этот период - 416 184.

Очень жаль.
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34871831
zenk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
70 минут? Попробуйте мой запросик
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34871944
Cold bringer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понимаю, что конструкция

Код: plaintext
tmp_rank1.t_sum >=  tmp_rank2.t_sum)

в принципе нежизнеспособна. 400 000 строк, в квадрате - 16 и десять нулей (обрабатываемые строки) - а сервер не сдохнет, "как та корова"?
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34871947
Cold bringer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забавно, но накатать такой запрос с ручным обходом по складам и датам - будет НАСТОЛЬКО дешевле для сервера, что даже рядом не стояло.
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34872719
Cold bringer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Угу, не стояло. Бдительный INFORMIX не даёт делать UNION и использовать FIRST в SELECT выражениях. Также не даёт использовать FIRST в table(multiset()). Я просто в шоке.

Я даже попытался сырые данные о продажах в ORACLE перетянуть, чтобы там уже обрабатывать, но это слишком долго тянется.

У меня подозрение, что для достижения искомой цели мне придётся забирать данные отдельными запросами, для каждого склада, и для каждой даты - в рамках одного коннекта - обалдеть.

Два дня уже убил.
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34872956
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cold bringerУгу, не стояло. Бдительный INFORMIX не даёт делать UNION и использовать FIRST в SELECT выражениях. Также не даёт использовать FIRST в table(multiset()). Я просто в шоке.

Я даже попытался сырые данные о продажах в ORACLE перетянуть, чтобы там уже обрабатывать, но это слишком долго тянется.

У меня подозрение, что для достижения искомой цели мне придётся забирать данные отдельными запросами, для каждого склада, и для каждой даты - в рамках одного коннекта - обалдеть.

Два дня уже убил.

Во-первых, не знаю какой у вас сервер, а у меня лаптоп вернул результаты для 400,000 записей за 10 минут :

---------
create table s_total (
t_from char(30),
t_date date,
t_kod int,
t_sum money(10,2)
);


create procedure ins_total (n int);
define i int;
define j int;
define k int;
define l int;

for i = 1 to n
LET l= mod(i, 20);
LET j = mod(i,30);
LET k = mod(i, 100);
insert into s_total values (l, today - j UNITS DAY, k, i);
end for;
end procedure;

call ins_total (400000)

create view mySUM (mystore, mydate, tov, mysum)
as
SELECT t_from,
t_date,
t_kod,
Sum(t_sum)
FROM s_total
WHERE t_date BETWEEN (TODAY - 31 UNITS DAY) AND (TODAY)
GROUP BY t_from, t_date, t_kod

--------- sel.sql ------
database dbase;
select a.myStore, a.myDate, a.TOV, a.mySum
from mySum A
where
(select count(*) from mySum B where
a.myStore = b.myStore
and a.myDate = b.myDate
and a.mySum < b.mySum) < 10
--------

/home/xxx>time dbaccess - sel.sql > /dev/null
Database selected.

300 row(s) retrieved.

Database closed.

real 10m22.572s
user 0m0.015s
sys 0m0.031s
-----------------

Во-вторых, есть обходной вариант для очень быстрого выполнения, которым я пользовался в подобной ситуации :

--------------- Variant 2 ------------
create temp table temp_t1 (
mystore char(30),
mydate date,
tov int,
mysum money(15,2)
);

create temp table temp_res (
mystore char(30),
mydate date,
tov int,
mysum money(15,2)
);

/* create a copy of summarized data */
insert into temp_t1
SELECT t_from as mystore,
t_date as mydate,
t_kod as tov,
Sum(t_sum) as mysum
FROM s_total
WHERE t_date BETWEEN (TODAY - 31 UNITS DAY) AND (TODAY)
GROUP BY t_from, t_date, t_kod;

/* find tovar with max mysum for each day, each store */
select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;


/* 1st place */
insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

/* 2nd place */
drop table temp_t3;

select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;

insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

/* 3rd place */
drop table temp_t3;

select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;

insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

/* 4 place */
drop table temp_t3;

select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;

insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

/* 5 place */
drop table temp_t3;

select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;

insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

/* 6 place */
drop table temp_t3;

select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;

insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

/* 7 place */
drop table temp_t3;

select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;

insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

/* 8 place */
drop table temp_t3;

select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;

insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

/* 9 place */
drop table temp_t3;

select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;

insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

/* 10 place */
drop table temp_t3;

select mystore, mydate, max(mysum) mysum
from temp_t1
group by mystore, mydate
into temp temp_t3;

insert into temp_res
select a.mystore, a.mydate, a.tov, a.mysum
from temp_t1 a, temp_t3 b
where a.mystore= b.mystore
and a.mydate = b.mydate
and a.mysum = b.mysum;

delete from temp_t1
where exists (select 1 from temp_res
where temp_t1.mystore= temp_res.mystore
and temp_t1.mydate = temp_res.mydate
and temp_t1.mysum = temp_res.mysum);

select * from temp_res;

----------
300 row(s) retrieved.


Database closed.


real 0m3.591s
user 0m0.031s
sys 0m0.015s

Инджой
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34882043
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выбегалло
...
real 0m3.591s
user 0m0.031s
sys 0m0.015s
Инджой
Выбегалло, мои бурные аплодисменты (надеюсь, что и остальных тоже).
За потраченное время на написание кода и тестирование и за отстаивание чести Информикса, в которой некоторые несправедливо начали сомневаться :)
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34882300
Cold bringer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
За потраченное время - огромная признательность, но отстаивание чести - вот этой простыней?
Мой сервер - это два XEON-а - почему-то 10 минут для него мало. Мой проект этим вот запросом не заканчивается, а я со страхом думаю о следующих задачах - там то что будет?

Смотрите, таблица:

Код: plaintext
USER_ID   NUMBER_OF_STATE  NAME_OF_STATE  START_OF_STATE

USERID - ID пользователя
NAMEOFSTATE - Название состояния пользователя (Перечисление,задано один раз, вида: "На рабочем месте","Отсутсвует","Отключен","Отсутсвует AUTO")
STARTOFSTATE - Начало состояния пользователя (Дата/время)
NUMBEROFSTATE - порядковый номер состояния, растёт в пределах юзера, строго +1 (можно было бы от этого столбца отказаться, но оставлен ради упрощения.)

Исходя из 8-ми часового рабочего дня - надо вывести таблицу вида:

Код: plaintext
1.
2.
Дата------На рабочем месте------Отсутствует-----Работа сверхнормы
   17 . 08 . 2007 -------7:30--------------------30---------------нет
   18 . 08 . 2007 ------- 8 : 22 --------------------Нет-------------- 22 
- и так - за весь требуемый период.

В ORACLE это один запрос. В INFORMIX-е наверное тоже можно понасоздавать таблиц, да вот только у моего пользователя нет на это прав. Только на SELECT.
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34882932
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cold bringerЗа потраченное время - огромная признательность, но отстаивание чести - вот этой простыней?
Мой сервер - это два XEON-а - почему-то 10 минут для него мало. Мой проект этим вот запросом не заканчивается, а я со страхом думаю о следующих задачах - там то что будет?

Смотрите, таблица:

Код: plaintext
USER_ID   NUMBER_OF_STATE  NAME_OF_STATE  START_OF_STATE

USERID - ID пользователя
NAMEOFSTATE - Название состояния пользователя (Перечисление,задано один раз, вида: "На рабочем месте","Отсутсвует","Отключен","Отсутсвует AUTO")
STARTOFSTATE - Начало состояния пользователя (Дата/время)
NUMBEROFSTATE - порядковый номер состояния, растёт в пределах юзера, строго +1 (можно было бы от этого столбца отказаться, но оставлен ради упрощения.)

Исходя из 8-ми часового рабочего дня - надо вывести таблицу вида:

Код: plaintext
1.
2.
Дата------На рабочем месте------Отсутствует-----Работа сверхнормы
   17 . 08 . 2007 -------7:30--------------------30---------------нет
   18 . 08 . 2007 ------- 8 : 22 --------------------Нет-------------- 22 
- и так - за весь требуемый период.

В ORACLE это один запрос. В INFORMIX-е наверное тоже можно понасоздавать таблиц, да вот только у моего пользователя нет на это прав. Только на SELECT.

Ну несите ваш оракловский запрос. Не исключено, что с минимальными переделками (или совсем без ) он будет работать на информиксе. Я бы вам нарисовал запрос, но непонятно что такое "отсуствует AUTO" и "отключен".
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34882976
Cold bringer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В контексте условия - "отсуствует AUTO" и "отключен" эквивалентно "отсутвствует".

Но спорить я не буду, поскольку в вашем профессионализме не сомневаюсь.
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34883763
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cold bringerЗа потраченное время - огромная признательность, но отстаивание чести - вот этой простыней?
...
В INFORMIX-е наверное тоже можно понасоздавать таблиц, да вот только у моего пользователя нет на это прав. Только на SELECT.
1. Не бывает в Informix пользователей, у которых нет права создавать временные таблицы.
2. Человек старался вам помочь, тратил время и силы, а вы даже не попробовали то, что он вам предложил.

ну подождите, может еще кто захочет помочь...
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34883986
Cold bringer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пф-ф-ф, вот только совестить меня не надо.

Такие простыни я могу накатать где угодно и на стороне какой угодно, РЕШЕНИЕМ это назвать можно с большой натяжкой.

Как вариант - поставить рядом с INFORMIX-ом в одной локалке ORACLE XE, и тянуть в него сырые данные, и обрабатывать уже в ORACLE. Я выбираю.
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34886007
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cold bringerПф-ф-ф, вот только совестить меня не надо.

Такие простыни я могу накатать где угодно и на стороне какой угодно, РЕШЕНИЕМ это назвать можно с большой натяжкой.

Как вариант - поставить рядом с INFORMIX-ом в одной локалке ORACLE XE, и тянуть в него сырые данные, и обрабатывать уже в ORACLE. Я выбираю.

Хочется лечить геморрой через рот, а гланды удалять через задницу - дело ваше.
...
Рейтинг: 0 / 0
Помогите написать запрос, пожалуйста..
    #34886035
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, проверил оригинальный запрос на втором лаптопе (тоже делл, но T7300) -

real 7m11.104s
user 0m0.031s
sys 0m0.000s


В таком вот аксепте
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / Informix [игнор отключен] [закрыт для гостей] / Помогите написать запрос, пожалуйста..
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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