Текущее время: Пт, мар 29 2024, 12:12

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Помогите сделать select из таблицы с миллионами строк
СообщениеДобавлено: Пн, окт 07 2019, 14:03 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Добрый день!

Есть Z-таблица c миллионами записей, мне нужно сделать (желательно!!!) одну выборку.

Суть выборки такова: за период выбрать из таблицы сумму по полю количества, а также выбрать максимальное количество и его дату.
В таблице количества хранятся в разрезе дней.
Пример таблицы:
Code:
ID  DATE              VOLUME     
1    07.10.2019      123,78
2    08.10.2019      33,12
3    09.10.2019      13,54
4    10.10.2019      3,35
 

Мне нужно получить строку: МаксКол: 123,78, его дата: 07.10.2019, всего: 173,79.
Code:
  select
      id
      max( VOLUM )
      sum( VOLUME )
    from ztab
   group by id.
 

Код, приведенный выше, дает желаемый результат, но без даты, к которой относится максимальное количество. Вставка даты в select и в group by нарушает логику и не собирает общую сумму (данные в разрезе дней, а не айдишника).

Буду очень рад любым подсказкам!

_________________
Заранее благодарен за помощь. С уважением, Primat.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите сделать select из таблицы с миллионами строк
СообщениеДобавлено: Пн, окт 07 2019, 15:23 
Ассистент
Ассистент

Зарегистрирован:
Пт, фев 01 2013, 10:27
Сообщения: 35
Добрый день.
Как вариант - заджойнить таблицу саму на себя, условие джойна volume = max( volume ). Только надо придумать что делать если будет несколько одинаковых максимальных значений..

PS. проверил , возникают проблемы с условием по максимальному значению в JOIN.
Тогда использовать промежуточный CDS view в котором считать сумму и максимум и затем этот view джойнить с исходной таблицей по volume = max_volume.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Помогите сделать select из таблицы с миллионами строк
СообщениеДобавлено: Пн, окт 07 2019, 16:19 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Извиняюсь за древность, но у нас версия 702. У нас нет CDS view :oops:

_________________
Заранее благодарен за помощь. С уважением, Primat.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите сделать select из таблицы с миллионами строк
СообщениеДобавлено: Пн, окт 07 2019, 17:23 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 347
А такое работает?
Code:
SELECT z~id z~date z~volume SUM( z2~volume ) AS sum
  FROM ztab AS z INNER JOIN ztab AS z2
                   ON z2~id = z~id
  INTO TABLE t
  WHERE volume = ( SELECT MAX( volume ) FROM ztab AS z3
                     WHERE z3~id = z~id  )
  GROUP BY z~id z~date z~volume
  ORDER BY z~volume.
UPD. Если в таблице для одного и того же id максимальная сумма будет повторяться для разных дат, то и при выборке строк с этой суммой будет несколько.


Последний раз редактировалось LAT Ср, окт 09 2019, 17:59, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите сделать select из таблицы с миллионами строк
СообщениеДобавлено: Вт, окт 08 2019, 07:18 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Цитата:
нужно сделать (желательно!!!) одну выборку

А правильно ли идеологически так поступать вообще, на реальной, возможно высоконагруженной СУБД (а если ещё и блокировочник типа ДБ/2)?
М.б. однопроходный скан всей таблицы с подсуммированием средствами абапа будет менее безжалостный к другим толпящимся в системе пользователям? :roll:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите сделать select из таблицы с миллионами строк
СообщениеДобавлено: Вт, окт 08 2019, 17:10 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4842
Откуда: Москва
Пол: Мужской
По поводу даты для максимального volum, как-то так (упрощая вариант LAT):
Code:
SELECT z~id z~date z~volume
         FROM ztab
  INTO TABLE t
  WHERE volume = ( SELECT MAX( volume ) FROM ztab  ).

Если сделать индекс по volum, работать будет моментально.
В Oracle можно без подзапроса написать с помощью keep dance rank, но это будет для SAP Native SQL, его использовать не рекомендуется

А вот общую сумму по volum придется отдельным селектом вытаскивать и в нем БД придется все строки таблицы на своей стороне перебрать.
Code:
select sum(volume) into l_volum_sum
from ztab

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите сделать select из таблицы с миллионами строк
СообщениеДобавлено: Вт, окт 08 2019, 17:14 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4842
Откуда: Москва
Пол: Мужской
pberezin написал:
Цитата:
нужно сделать (желательно!!!) одну выборку

А правильно ли идеологически так поступать вообще, на реальной, возможно высоконагруженной СУБД (а если ещё и блокировочник типа ДБ/2)?
М.б. однопроходный скан всей таблицы с подсуммированием средствами абапа будет менее безжалостный к другим толпящимся в системе пользователям? :roll:


Не скажу за DB/2, но с нормальной БД (Oracle) как раз-таки безжалостно таскать по сети с БД на сервер приложений миллионы строк ради того чтобы на выходе получить одно число.

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB