Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2014, 22:58   #1
jbionic
Новичок
Джуниор
 
Регистрация: 05.11.2014
Сообщений: 1
По умолчанию Найти 5 наиболее недавних записей с "ненормальными" заказами

Даны 2 таблицы :
create table dbo.customer (customer_id int identity primary key clustered, customer_name nvarchar(256) not null)

и

create table dbo.purchase_order (

purchase_order_id int identity primary key clustered

, customer_id int not null

, amount money not null

, order_date date not null


Говорится, что выкидышами (Outliers) считаются значения которые лежат ниже, либо выше 3 стандартных отклонений от среднего значения ( < AVG() - 3 * STDDEV(), либо > AVG() + 3 * STDDEV()

Для каждого кастомера нужно найти 5 наиболее недавних дат, для которых были характерны ненормальные значения (выкидыши) в объемах заказа (amount), и для каждой из этих дат ввывести также минимальное и максимальное значения amount. Так чтобы возможный результат получался примерно в таком виде (см. аттачмент).
http://triontp.pop3.ru/333.gif
jbionic вне форума Ответить с цитированием
Старый 06.11.2014, 10:07   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select last.customer_id, last.order_date, mm.minmount, mm.maxmount
from (  select customer_id, order_date,
          ( select count(distinct order_date) --число дней
             from purchase_order as stat   --в которые
             where abs(stat.amount-avg.avg)>avg.dev3 --были выбросы
                and stat.customer_id=purchase_order.customer_id --и для указанного customer_id
                and stat.order_date<=purchase_order.order_date --и до указанного дня 
           ) as num  ===число дней ПРЕДЫДУЩИХ выбросов
          from purchase_order
          inner join ( select customer_id, avg(amount) as avg, 3*stddev(amount) as dev3,
                          from purchase_order group by customer_id 
                        ) as AVG on avg.customer_id =purchase_order.customer_id
          where abs(purchase_order.amount-avg.avg)>avg.dev3 
       ) as last
inner join ( select customer_id, order_date, min(amount) as minmount, max(amount)  as maxmount --мин/макс
                from purchase_order 
                group by customer_id, order_date  --по ВСЕМ customer_id и ВСЕМ дням
              ) as mm on mm.customer_id=last.customer_id and mm.order_date =last.order_date 
where last.num<=5 -- только ПЕРВЫЕ (СамыЕ ранние!!!!) пять дат (В задаче надо было ПОСЛЕДНИЕ пять!!!!!)
Для исправления достаточно сменить один единственный знак в комментированных(!) строках.
Также нет присоединения имен customer.customer_name
Поскольку задача явно учебная.
Цитата:
Говорится, что ...
P.S. подсказка. считать надо не предыдущие дни а последующие.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.11.2014 в 10:11.
evg_m вне форума Ответить с цитированием
Старый 06.11.2014, 10:20   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

stddev - из Oracle?
ROW_NUMBER можно использовать для нумерации если Oracle или MS SQL (с 2005)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
на вход подаются сведения об учениках и оценках. Найти тех, кто сдал на "4" и "5" ( Паскаль ) weech Помощь студентам 1 18.11.2011 13:57
Найти слова, в которых доля букв "а" и "е" минимальна. Андрей_ка Паскаль, Turbo Pascal, PascalABC.NET 0 10.10.2010 16:56
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Помогите пожайлуста найти, кто человек "вконтакте", зная его "мэйл" Аксюнька1990 Помощь студентам 1 12.06.2009 06:16