Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Бабичев СергейА что, в Informix-е строки сравнивать между собой нельзя? Конечно же можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 13:00 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
А если несколько товаров дали в один день одну и ту же выручку? Я не нашёл, где надо построить отчёт - в разрабатываемом приложении или в отчётной системе? Если первое, то проблем с использованием временных таблиц быть не должно. Если товаров сотни тысяч наименований, я бы написал примерно так: Код: 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. Извините, если где-то ошибки в синтаксисе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 14:34 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Иэх, господа - это всё здорово, но такие запросы не возвращают результата. Запрос отсылается на сервер, в течении семидесяти минут не было ответа - потом я выключил. Обрабатывал пять дней, записей в таблице за этот период - 416 184. Очень жаль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 14:50 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
70 минут? Попробуйте мой запросик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 14:52 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Я так понимаю, что конструкция Код: plaintext в принципе нежизнеспособна. 400 000 строк, в квадрате - 16 и десять нулей (обрабатываемые строки) - а сервер не сдохнет, "как та корова"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 15:17 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Забавно, но накатать такой запрос с ручным обходом по складам и датам - будет НАСТОЛЬКО дешевле для сервера, что даже рядом не стояло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 15:19 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Угу, не стояло. Бдительный INFORMIX не даёт делать UNION и использовать FIRST в SELECT выражениях. Также не даёт использовать FIRST в table(multiset()). Я просто в шоке. Я даже попытался сырые данные о продажах в ORACLE перетянуть, чтобы там уже обрабатывать, но это слишком долго тянется. У меня подозрение, что для достижения искомой цели мне придётся забирать данные отдельными запросами, для каждого склада, и для каждой даты - в рамках одного коннекта - обалдеть. Два дня уже убил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 18:01 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
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 Инджой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 19:36 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Выбегалло ... real 0m3.591s user 0m0.031s sys 0m0.015s Инджой Выбегалло, мои бурные аплодисменты (надеюсь, что и остальных тоже). За потраченное время на написание кода и тестирование и за отстаивание чести Информикса, в которой некоторые несправедливо начали сомневаться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2007, 20:08 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
За потраченное время - огромная признательность, но отстаивание чести - вот этой простыней? Мой сервер - это два XEON-а - почему-то 10 минут для него мало. Мой проект этим вот запросом не заканчивается, а я со страхом думаю о следующих задачах - там то что будет? Смотрите, таблица: Код: plaintext USERID - ID пользователя NAMEOFSTATE - Название состояния пользователя (Перечисление,задано один раз, вида: "На рабочем месте","Отсутсвует","Отключен","Отсутсвует AUTO") STARTOFSTATE - Начало состояния пользователя (Дата/время) NUMBEROFSTATE - порядковый номер состояния, растёт в пределах юзера, строго +1 (можно было бы от этого столбца отказаться, но оставлен ради упрощения.) Исходя из 8-ми часового рабочего дня - надо вывести таблицу вида: Код: plaintext 1. 2. В ORACLE это один запрос. В INFORMIX-е наверное тоже можно понасоздавать таблиц, да вот только у моего пользователя нет на это прав. Только на SELECT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2007, 02:07 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Cold bringerЗа потраченное время - огромная признательность, но отстаивание чести - вот этой простыней? Мой сервер - это два XEON-а - почему-то 10 минут для него мало. Мой проект этим вот запросом не заканчивается, а я со страхом думаю о следующих задачах - там то что будет? Смотрите, таблица: Код: plaintext USERID - ID пользователя NAMEOFSTATE - Название состояния пользователя (Перечисление,задано один раз, вида: "На рабочем месте","Отсутсвует","Отключен","Отсутсвует AUTO") STARTOFSTATE - Начало состояния пользователя (Дата/время) NUMBEROFSTATE - порядковый номер состояния, растёт в пределах юзера, строго +1 (можно было бы от этого столбца отказаться, но оставлен ради упрощения.) Исходя из 8-ми часового рабочего дня - надо вывести таблицу вида: Код: plaintext 1. 2. В ORACLE это один запрос. В INFORMIX-е наверное тоже можно понасоздавать таблиц, да вот только у моего пользователя нет на это прав. Только на SELECT. Ну несите ваш оракловский запрос. Не исключено, что с минимальными переделками (или совсем без ) он будет работать на информиксе. Я бы вам нарисовал запрос, но непонятно что такое "отсуствует AUTO" и "отключен". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2007, 05:08 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
В контексте условия - "отсуствует AUTO" и "отключен" эквивалентно "отсутвствует". Но спорить я не буду, поскольку в вашем профессионализме не сомневаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2007, 10:34 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Cold bringerЗа потраченное время - огромная признательность, но отстаивание чести - вот этой простыней? ... В INFORMIX-е наверное тоже можно понасоздавать таблиц, да вот только у моего пользователя нет на это прав. Только на SELECT. 1. Не бывает в Informix пользователей, у которых нет права создавать временные таблицы. 2. Человек старался вам помочь, тратил время и силы, а вы даже не попробовали то, что он вам предложил. ну подождите, может еще кто захочет помочь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2007, 09:13 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Пф-ф-ф, вот только совестить меня не надо. Такие простыни я могу накатать где угодно и на стороне какой угодно, РЕШЕНИЕМ это назвать можно с большой натяжкой. Как вариант - поставить рядом с INFORMIX-ом в одной локалке ORACLE XE, и тянуть в него сырые данные, и обрабатывать уже в ORACLE. Я выбираю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2007, 10:38 |
|
||
|
Помогите написать запрос, пожалуйста..
|
|||
|---|---|---|---|
|
#18+
Cold bringerПф-ф-ф, вот только совестить меня не надо. Такие простыни я могу накатать где угодно и на стороне какой угодно, РЕШЕНИЕМ это назвать можно с большой натяжкой. Как вариант - поставить рядом с INFORMIX-ом в одной локалке ORACLE XE, и тянуть в него сырые данные, и обрабатывать уже в ORACLE. Я выбираю. Хочется лечить геморрой через рот, а гланды удалять через задницу - дело ваше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2007, 18:17 |
|
||
|
|

start [/forum/topic.php?fid=44&msg=34882300&tid=1608276]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
41ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 258ms |
| total: | 389ms |

| 0 / 0 |
