Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск максимального и минимального значения 
V
    Опции темы
krinart
Дата 26.8.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



Здравствуйте, столкнулся я с одной задачкой, буду очень признателен за любую помощь.

Есть таблица следующей структуры:
Код

country_id int(11) NOT NULL,
product_id int(11) NOT NULL,
period varchar(20) NOT NULL,
value decimal(11,2) NOT NULL


Где могут хранится, к примеру, такие данные:

Код

country_id     product_id     period       value
     10            1         1990/1991     0.00
     10            1         1991/1992     317.00
     10            1         1992/1993     20.00
     10            1         1993/1994     347.00
     11            1         1990/1991     300.00
     11            1         1991/1992     417.00
     11            1         1992/1993     30.00
     11            1         1993/1994     47.00


Существует ли возможность одним запросом получить по каждому товару такие данные: по каждой стране максимальное и минимальное значение и периоды, когда эти значения появились.
То есть в результате должно получиться чтото вроде такого

Код

country_id    max_value  max_period  min_value  min_period
    10         347.00    1993/1994     0.00     1990/1991
    11         417.00    1991/1992     30.00    1992/1993


Конечно, сначала я сделал в лоб, цикл по товарам и внутренним циклом по странам. Но так как стран около 150, а товаров около 8, получается около 1200 запросов - что есть очень не хорошо. 
Буду признателен за любую помощь.

Это сообщение отредактировал(а) krinart - 26.8.2011, 15:09
PM MAIL ICQ   Вверх
Zloxa
Дата 26.8.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



А вы хоть что нибудь по SQL читать пробовали, прежде чем программировать начали?
Откройте главу про группировку. Первый же пример - ваш.

Код

select country_id, max(value) max_value, max(period) max_period, min(value) min_value, min(period) min_perood
from .......
group by country_id



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
krinart
Дата 26.8.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



Zloxa, смысл не в том, чтобы найти максимально/минимально возможный период. Мне нужно найти период, где встречается это максимальное/минимальное значение.
PM MAIL ICQ   Вверх
Zloxa
Дата 26.8.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(krinart @  26.8.2011,  15:04 Найти цитируемый пост)
Мне нужно найти период, где встречается это максимальное/минимальное значение. 

сорри, не правильно понял.

Какая платформа?



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
krinart
Дата 26.8.2011, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



Zloxa, mysql
PM MAIL ICQ   Вверх
Zloxa
Дата 26.8.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(krinart @  26.8.2011,  15:10 Найти цитируемый пост)
mysql 

stff бабушкин метод

В кратце суть - value преобразуем в строку, дополняем лидирующими нулями, чтобы строковая сортировка совпадала с числовой, в конец строки конкатенируем значение периода, считаем аггрегат min/max, из полученного значения ихзвлекаем хвостик периода.  

Это если нам надо получить одно, любое значение из многих возможных минимальных/максимальных value. Если нам надо поулчить все такие значения - не понятно по каким критериям объединять минимальные и максимальные.

Это сообщение отредактировал(а) Zloxa - 26.8.2011, 16:51


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
krinart
Дата 26.8.2011, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



Zloxa, спасибо за наводку, попробую. А какого-нибудь более "академического" метода не существует? Больше похоже на какие-то ужасные костыли, чем на грамотный запрос.
PM MAIL ICQ   Вверх
Zloxa
Дата 26.8.2011, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(krinart @  26.8.2011,  15:30 Найти цитируемый пост)
А какого-нибудь более "академического" метода не существует?

Код

select country_id
       ,max_vlalue
       ,(select period from .... t 
             where t.counry = s.counry 
                and t.value = s.max_value 
          order by ??? limit 1) max_period
       ,min_vlalue
       ,(select period from .... t 
             where t.counry = s.counry 
                and t.value = s.min_value 
          order by ??? limit 1) min_period
from (
  select country_id
         , max(value) max_value
         ,min(value) min_value
  from .......
  group by country_id
) s


но это тоже далеко не "академическое". Академическое куда менее читабельно и производительно. Упоминается, разжовывается по результатам поиска, не работает, если может быть более одного минимального или же максимального значения.

Это сообщение отредактировал(а) Zloxa - 26.8.2011, 16:54


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
krinart
Дата 26.8.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



Zloxa, спасибо большое за "бабушкин метод"! это прекрасное решение!

Есть ещё вопрос. Теперь требуется находить "прирост" у каждой страны по каждому товару, где вычисляется разница значений последнего и предпоследнего периодов. То есть результат должен получиться такой:

Код

country  delta  
  10     327.00
  11     17.00
 

Существует ли для этой задачи решение?
PM MAIL ICQ   Вверх
Zloxa
Дата 26.8.2011, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(krinart @  26.8.2011,  16:54 Найти цитируемый пост)
где вычисляется разница значений последнего и предпоследнего периодов. То есть результат должен получиться такой:

Если я правильно понял, и последниее, предпоследнее  ранжируются периодом...
Последнее значение получаем бабушкиным методом
предпоследнее - кореллированным скалярным подзапросом
строковые функции mysql не знаю на вскидку, но если псевдокодом, то как то - так:
Код

select s.country_id
       ,last_vlue - (select value from t 
                      where t.country_id = s.country_id
                         and t.period < s.max_period
                      order by period desc 
                      limit 1
                      ) 
        as delta
from (
  select country_id
         , substr(max(concat(period,value)),10) last_value
         ,max(period) max_period
  from t   
  group by country_id
) s



Это сообщение отредактировал(а) Zloxa - 26.8.2011, 17:10


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
krinart
Дата 29.8.2011, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



Zloxa, огромное спасибо за два прекрасных решения!

Это сообщение отредактировал(а) krinart - 29.8.2011, 09:14
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1331 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.