Моё меню Общее меню Пользователи Правила форума Все прочитано
Вернуться   uForum.uz > ИКТ и телеком > Разное/IT
Знаете ли Вы, что ...
...для каждой темы существует свой раздел. Изучите структуру форума. Если соответствующего раздела нет, то всегда есть раздел "Разное" :)
<< Предыдущий совет - Случайный совет - Следующий совет >>

Разное/IT Всё, что не попадает в другие разделы форума и подфорумов представленных здесь организаций. Не IT темы обсуждаются в "Беседке"


Ответить

 
Опции темы Опции просмотра
Старый 18.10.2013 18:07   #61  
uParty Member Known ID Group Ultimate
Аватар для OmoN
Оффлайн
програмщег
Сообщений: 4,971
+ 2,743  5,086/2,116
– 69  99/68

Uzbekistan
Цитата:
Сообщение от Alisher Umarov Посмотреть сообщение
1. Виртуальный колхоз "Кизил пиёз. Пять бригад каждый день сдают на склад пиёз в кг.
Текущий отчёт:
За день. За неделю. За месяц. За квартал. За год.
Если структура таблицы так:
Цитата:
Сообщение от Alisher Umarov Посмотреть сообщение
id, product_name, br1, br2, br3, br4, br5, date
В оракле:
PHP код:
Select 0,
       
'Daily',
       
To_Char(Date_Ini'YYYY-MM-DD'Date_Ini,
       
Sum(Br_1Br_1,
       
Sum(Br_2Br_2,
       
Sum(Br_3Br_3,
       
Sum(Br_4Br_4,
       
Sum(Br_5Br_5,
       
Date_Ini Sort_Date
  From Task_1
 Group By Date_Ini
Union
Select 1
,
       
'Weekly',
       
To_Char(Max(Date_IniOver(Partition By To_Char(Date_Ini'WWYYYY')),
               
'WW-YYYY'Date_Ini,
       
Sum(Br_1Over(Partition By To_Char(Date_Ini'WWYYYY')) Br1,
       
Sum(Br_2Over(Partition By To_Char(Date_Ini'WWYYYY')) Br2,
       
Sum(Br_3Over(Partition By To_Char(Date_Ini'WWYYYY')) Br3,
       
Sum(Br_4Over(Partition By To_Char(Date_Ini'WWYYYY')) Br4,
       
Sum(Br_5Over(Partition By To_Char(Date_Ini'WWYYYY')) Br5,
       
Max(Date_IniOver(Partition By To_Char(Date_Ini'WWYYYY')) Sort_Date
  From Task_1
Union
Select 2
,
       
'Monthly',
       
To_Char(Max(Date_IniOver(Partition By To_Char(Date_Ini'MMYYYY')),
               
'YYYY-MM'Date_Ini,
       
Sum(Br_1Over(Partition By To_Char(Date_Ini'MMYYYY')) Br1,
       
Sum(Br_2Over(Partition By To_Char(Date_Ini'MMYYYY')) Br2,
       
Sum(Br_3Over(Partition By To_Char(Date_Ini'MMYYYY')) Br3,
       
Sum(Br_4Over(Partition By To_Char(Date_Ini'MMYYYY')) Br4,
       
Sum(Br_5Over(Partition By To_Char(Date_Ini'MMYYYY')) Br5,
       
Max(Date_IniOver(Partition By To_Char(Date_Ini'MMYYYY')) Sort_Date
  From Task_1
Union
Select 3
,
       
'Quarter',
       
To_Char(Max(Date_IniOver(Partition By To_Char(Date_Ini'QYYYY')),
               
'Q-YYYY'Date_Ini,
       
Sum(Br_1Over(Partition By To_Char(Date_Ini'QYYYY')) Br1,
       
Sum(Br_2Over(Partition By To_Char(Date_Ini'QYYYY')) Br2,
       
Sum(Br_3Over(Partition By To_Char(Date_Ini'QYYYY')) Br3,
       
Sum(Br_4Over(Partition By To_Char(Date_Ini'QYYYY')) Br4,
       
Sum(Br_5Over(Partition By To_Char(Date_Ini'QYYYY')) Br5,
       
Max(Date_IniOver(Partition By To_Char(Date_Ini'QYYYY')) Sort_Date
  From Task_1
Union
Select 4
,
       
'Year',
       
To_Char(Max(Date_IniOver(Partition By To_Char(Date_Ini'YYYY')),
               
'YYYY'Date_Ini,
       
Sum(Br_1Over(Partition By To_Char(Date_Ini'YYYY')) Br1,
       
Sum(Br_2Over(Partition By To_Char(Date_Ini'YYYY')) Br2,
       
Sum(Br_3Over(Partition By To_Char(Date_Ini'YYYY')) Br3,
       
Sum(Br_4Over(Partition By To_Char(Date_Ini'YYYY')) Br4,
       
Sum(Br_5Over(Partition By To_Char(Date_Ini'YYYY')) Br5,
       
Max(Date_IniOver(Partition By To_Char(Date_Ini'YYYY')) Sort_Date
  From Task_1
 Order By 9

__________________
Ошибки прошлого, мудрость будущего. (с)Д.Тернер.
Ответить 
Старый 19.10.2013 01:27   #62  
uParty Member Known ID Group Ultimate
Аватар для OmoN
Оффлайн
програмщег
Сообщений: 4,971
+ 2,743  5,086/2,116
– 69  99/68

Uzbekistan
Если окончательно извращаться первую задачу можно оптимизировать так:
PHP код:
Select Distinct d.Id,
       
d.Str,
       
To_Char(Max(Date_IniOver(Partition By To_Char(Date_Inid.Format)),
               
d.FormatDate_Ini,
       
Sum(Br_1Over(Partition By To_Char(Date_Inid.Format)) Br1,
       
Sum(Br_2Over(Partition By To_Char(Date_Inid.Format)) Br2,
       
Sum(Br_3Over(Partition By To_Char(Date_Inid.Format)) Br3,
       
Sum(Br_4Over(Partition By To_Char(Date_Inid.Format)) Br4,
       
Sum(Br_5Over(Partition By To_Char(Date_Inid.Format)) Br5,
       
Max(Date_IniOver(Partition By To_Char(Date_Inid.Format)) Sort_Date
  From Task_1

       (
Select 0 Id'Daily' Str'YYYY-MM-DD' Format From Dual
        Union
        Select 1 Id
'Weekly' Str'YYYY-WW' Format From Dual
        Union 
        Select 2 Id
'Monthly' Str'YYYY-MM' Format From Dual
        Union
        Select 3 Id
'Quarter' Str'YYYY-Q' Format From Dual
        Union
        Select 4 Id
'Year' Str'YYYY' Format From Duald
Order By 9
,
__________________
Ошибки прошлого, мудрость будущего. (с)Д.Тернер.

Последний раз редактировалось OmoN; 19.10.2013 в 01:33.
Ответить 
Старый 19.10.2013 02:23   #63  
uParty Member Known ID Group Ultimate
Аватар для OmoN
Оффлайн
програмщег
Сообщений: 4,971
+ 2,743  5,086/2,116
– 69  99/68

Uzbekistan
Цитата:
Сообщение от JackDaniels Посмотреть сообщение
2. Дано 1М записей;
Не самый производительный сервер;
Нужно: ORDER BY RAND() LIMIT 10;
Таблица:
PHP код:
create table TASK_2
(
  
id  NUMBER,
  
val NUMBER

Запрос:
PHP код:
Select IdVal
  From 
(Select Distinct IdValTrunc(Dbms_Random.Value(11000000)) Rand
          From Task_2
         Order By Rand
)
 
Where Rownum 11 
ПС: Прощу прощение что все решение на оракле. У меня нет MySQL.
__________________
Ошибки прошлого, мудрость будущего. (с)Д.Тернер.
Ответить 
Реклама и уведомления
Старый 19.10.2013 09:27   #64  
Real ID Group Ultimate 2008
Аватар для Alisher Umarov
Оффлайн
AKA:Jazz
Сообщений: 4,528
+ 1,247  2,402/1,186
– 5  244/97

Uzbekistan
Небольшая придирка к первой задаче, которая вылезла в практике. (Даёт хорошее представление чем отличается мышления дева и юзера)
Неделя - у юзера, это количество сданного лука за последние СЕМЬ дней.
А вот месяц, квартал и год - календарные.
Конечно это спорный вопрос. Но чтобы избежать этого, в отчетах следует разбивать вариации запросов в малых периодах.
Это легко представить когда week попадёт между двух месяцев.
Ответить 
Старый 19.10.2013 09:38   #65  
Real ID Group Ultimate 2008
Аватар для Alisher Umarov
Оффлайн
AKA:Jazz
Сообщений: 4,528
+ 1,247  2,402/1,186
– 5  244/97

Uzbekistan
OmoN
Все же Dolphin прав. Такие отчёты желательно разбивать по периодам. Зачем пересчитывать данные за год если нужен всего лишь отчёт за день? А если база за десять лет?
Ответить 
Старый 19.10.2013 10:49   #66  
uParty Member Known ID Group Ultimate
Аватар для OmoN
Оффлайн
програмщег
Сообщений: 4,971
+ 2,743  5,086/2,116
– 69  99/68

Uzbekistan
Цитата:
Сообщение от Alisher Umarov Посмотреть сообщение
Такие отчёты желательно разбивать по периодам. Зачем пересчитывать данные за год если нужен всего лишь отчёт за день? А если база за десять лет?
Я думал нужен весь отчет вместе. Какие передаваемые параметры?
Upd: Решение для первой задачи не верна. Заполнял таблицу данными на 2 года.
PHP код:
Procedure Fill_Task1 Is
    v_Date Date 
:= To_Date('20110101''YYYYMMDD');
    
i      Number := 0;
  
Begin
    Loop
      Insert Into Task_1
        
(IdProductDate_IniBr_1Br_2Br_3Br_4Br_5)
      
Values
        
(i,
         
'Onion',
         
Trunc(v_Date),
         
Trunc(Dbms_Random.Value(1100)),
         
Trunc(Dbms_Random.Value(1100)),
         
Trunc(Dbms_Random.Value(1100)),
         
Trunc(Dbms_Random.Value(1100)),
         
Trunc(Dbms_Random.Value(1100)));
      
v_Date := v_Date 1;
      
i      := 1;
      If (
Trunc(v_Date) > To_Date('20121231''YYYYMMDD')) Then
        
Exit;
      
End If;
    
End Loop;
    
Commit;
  
End
Результат не верен. Игнор.
__________________
Ошибки прошлого, мудрость будущего. (с)Д.Тернер.

Последний раз редактировалось OmoN; 19.10.2013 в 11:11.
Ответить 
Старый 19.10.2013 11:36   #67  
uParty Member Known ID Group Ultimate
Аватар для OmoN
Оффлайн
програмщег
Сообщений: 4,971
+ 2,743  5,086/2,116
– 69  99/68

Uzbekistan
Цитата:
Сообщение от OmoN Посмотреть сообщение
Результат не верен. Игнор.
Точнее сортировка хромает.
__________________
Ошибки прошлого, мудрость будущего. (с)Д.Тернер.
Ответить 
Старый 19.10.2013 20:25   #68  
Аватар для Nestik
Оффлайн
ZOG
eminence grise
Сообщений: 2,258
+ 277  835/480
– 353  232/151

UzbekistanОтправить сообщение для Nestik с помощью ICQ
Цитата:
Сообщение от Alisher Umarov Посмотреть сообщение
OmoN
Все же Dolphin прав. Такие отчёты желательно разбивать по периодам. Зачем пересчитывать данные за год если нужен всего лишь отчёт за день? А если база за десять лет?
Ну пля так и сделайте тогда во where :date_from :date_to группировка по продукту и сумма по бригадам, и нехай юзверь со своими закидонами сам решает чё у него там день, 7 дней или неделя, месяц, квартал, год, 100 лет.

Задача вообще какая-то сумбурная.
Ответить 
"+" от:
Старый 20.10.2013 01:14   #69  
Real ID Group Ultimate 2008
Аватар для Alisher Umarov
Оффлайн
AKA:Jazz
Сообщений: 4,528
+ 1,247  2,402/1,186
– 5  244/97

Uzbekistan
Цитата:
Сообщение от Nestik Посмотреть сообщение
Цитата:
Сообщение от Alisher Umarov Посмотреть сообщение
OmoN
Все же Dolphin прав. Такие отчёты желательно разбивать по периодам. Зачем пересчитывать данные за год если нужен всего лишь отчёт за день? А если база за десять лет?
Ну пля так и сделайте тогда во where :date_from :date_to группировка по продукту и сумма по бригадам, и нехай юзверь со своими закидонами сам решает чё у него там день, 7 дней или неделя, месяц, квартал, год, 100 лет.

Задача вообще какая-то сумбурная.
Ещё один типичный пример dev подхода против юзерского.
Доказано много раз - юзеры чрезвычайно редко знают что им нужно в конечном виде. К этому давно пора привыкнуть.
(Но в данном примере именно показано что к датам в SQL нужно относится осторожно)
Ответить 
Старый 20.10.2013 09:07   #70  
uParty Member Known ID Group Ultimate
Аватар для OmoN
Оффлайн
програмщег
Сообщений: 4,971
+ 2,743  5,086/2,116
– 69  99/68

Uzbekistan
В предедущем запросе формат недели YYYY-WW дал неправильные результаты. Он не показывал первые 4 недели года. Причину не знаю. Если формат недели YYYY.WW работает нормально. И тут добавил фильтр по дата начало и дата окончание отчетного периода.
PHP код:
Select Distinct d.Id,
       
d.Str,
       
To_Char(Max(Date_IniOver(Partition By To_Char(Date_Inid.Format)),
               
d.FormatDate_Ini,
       
Sum(Br_1Over(Partition By To_Char(Date_Inid.Format)) Br1,
       
Sum(Br_2Over(Partition By To_Char(Date_Inid.Format)) Br2,
       
Sum(Br_3Over(Partition By To_Char(Date_Inid.Format)) Br3,
       
Sum(Br_4Over(Partition By To_Char(Date_Inid.Format)) Br4,
       
Sum(Br_5Over(Partition By To_Char(Date_Inid.Format)) Br5,
       
Max(Date_IniOver(Partition By To_Char(Date_Inid.Format)) Sort_Date
  From Task_1

       (
Select 0 Id'Daily' Str'YYYY-MM-DD' Format From Dual
        Union
        Select 1 Id
'Weekly' Str'YYYY.WW' Format From Dual
        Union 
        Select 2 Id
'Monthly' Str'YYYY-MM' Format From Dual
        Union
        Select 3 Id
'Quarter' Str'YYYY-Q' Format From Dual
        Union
        Select 4 Id
'Year' Str'YYYY' Format From Duald
  Where Trunc
(Date_Ini) >= To_Date('20110101','YYYYMMDD')
  And 
Trunc(Date_Ini) < To_Date('20130101','YYYYMMDD')
Order By 9,
__________________
Ошибки прошлого, мудрость будущего. (с)Д.Тернер.
Ответить 
Реклама и уведомления
Ответить
Опции темы
Опции просмотра




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Advertisement System V2.5 By Branden
OOO «Единый интегратор UZINFOCOM»


Новые 24 часа Кто на форуме Новички Поиск Кабинет Все прочитано Вверх