powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Сумма предыдущих значений
24 сообщений из 24, страница 1 из 1
Сумма предыдущих значений
    #37932647
SamantaBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Работаю с Sybase, ASE номер по памяти не помню, увы.
Если Вам не сложно, не могли бы вы помочь решить одну задачку:

Есть таблица:
Имя|Дата|Значение|Сумма|

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

Значение|Сумма|
1| 1|
1| 2|
1| 3|
1| 4|

Если писать Sum в лоб, то он считает сумму всего столбца и плевать он хотел, что это временная таблица, которая в этот момент и создается.
Так посчитать вообще реально?
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37932661
SamantaBlack,
а как у Вас именно приведенные цифры получаются?
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37932664
SamantaBlack, кажется понял.
попробуйте так:
Код: sql
1.
2.
3.
4.
5.
select Name
      ,Date
      ,Value
      ,(select sum(value) from T where T.Name = T0.Name and T.Date<=T0.Date) 
  from T T0
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37932748
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> табличка отсортированная по столбцам Имя и Дата, а вот с заполнением столбца
> Сумма у меня загвоздка. В этом столбце должна быть сумма всех предыдущих
> значений для столбца Значение. То есть примерно так:

Это извини тебе не Эксель, это реляционная БД. Выбирай свои данные
в эксель и там такой фигнёй занимайся.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37933562
SamantaBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivЭто извини тебе не Эксель, это реляционная БД. Выбирай свои данные
в эксель и там такой фигнёй занимайся.


Если вы не знаете, как решить задачу, это не делает ее фигней. Задачка вполне реальна и благодаря помощи людей, сегодня утром я закрыла проект. ^^ А посылать в эксеот грубо, толсто и не смешно, видимо вы сами все решаете в экселе.
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37933564
SamantaBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СуммаПредыдущихSamantaBlack, кажется понял.
попробуйте так:
Код: sql
1.
2.
3.
4.
5.
select Name
      ,Date
      ,Value
      ,(select sum(value) from T where T.Name = T0.Name and T.Date<=T0.Date) 
  from T T0



спасибо, и я дурак не смог отредактировать сообщение.
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37935519
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Если вы не знаете, как решить задачу, это не делает ее фигней. Задачка вполне
> реальна и благодаря помощи людей, сегодня утром я закрыла проект. ^^ А посылать
> в эксеот грубо, толсто и не смешно, видимо вы сами все решаете в экселе.

Это ты должен прежде всего понимать, какими средствами какие задачи надо решать.
И использовать подходящие. А ты видимо недогоняешь...

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37936195
Юрий Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SamantaBlack,

Не знаток ASE, да и версия не известна. В ASA с 11-й версии можно делать так-
Код: sql
1.
2.
3.
4.
select Name
      ,Date
      ,Value,
      SUM(Value) over(order by Name  range between unbounded preceding and current row) as Summa from test



Если в вашей СУБД OLAP функции работают, то подсчёт суммы нарастающим итогом почти мгновенен и не загружает сервер, как в вышеуказанном способе.
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37940070
MasterZivЭто ты должен прежде всего понимать, какими средствами какие задачи надо решать.
И использовать подходящие. А ты видимо недогоняешь...

а что, нарастающий Этог - задача, непосильная для SQL?
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37940603
SQLMantis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SamantaBlackСуммаПредыдущихSamantaBlack, кажется понял.
попробуйте так:
Код: sql
1.
2.
3.
4.
5.
select Name
      ,Date
      ,Value
      ,(select sum(value) from T where T.Name = T0.Name and T.Date<=T0.Date) 
  from T T0



спасибо, и я дурак не смог отредактировать сообщение.

Ну круто че...
Таблицу надо заполнять исходя из предыдущих значений?
MasterZiv, все Вам правильно написал а Вы не прислушались.
Просто закрыли проект.
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37941006
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> а что, нарастающий Этог - задача, непосильная для SQL?

В общем-то да. Она противоречит основной модели хранения данных --
таблица есть множество неупрорядоченных кортежей.

Все операции, связанные с обработкой строк в определённом порядке,
проблемные для SQL -- он для этого не предназначен.
Конечно, в конкретной СУБД могут быть какие-то расширения для
этого, тогда их можно использовать.

В ASE такого нет, есть только compute by, но там окна не плавающие,
фиксированные, как в group by, ну и далеко не все клиенты
поддерживают это.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37941012
MasterZiv,

И что вы предлагаете?
допустим, мне на некоем участке обработки данных необходимо посчитать нарастающий итог.
Примем, что я считаю, что это не SQL-ная задача.
То есть, я должен выгрузить полученные данные во внешнюю систему, там написать некий обработчик, а затем повторно из загрузить обратно, так как результат был только промежуточным, и требуется его дальнейшая обработка средствами SQL. Так?
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37941739
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хоть мне это и не нравится, но считать нарастающие итоги, суммы по окнам с учетом порядка строк и прочие такого радоа вещи является стандартизованной функцией современного языка SQL. Так что нравится или нет, но ОЛАП функционал неизбежен. Отсутствие его поддержки в АСЕ - проблема АСЕ.
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37941894
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу сказать что MasterZiv с его пуританскими взглядами так уж сильно не прав. Но и его оппонента тоже высказывает здравые мысли.
Нужна ли позиционная аналитика на РСУБД это вопрос давний и сложный. С одной стороны вся такая аналитика намного удобнее делается на клиенте где можно играть и с массивами и с циклами. Но с другой стороны, чтобы это все делать на клиенте надо сначала вытащить на клиента сырые данные, а их может быть очень много.
В моей практике ни разу не требовалось записывать результаты анализа обратно в базу и они никогда не были основой для вторичной обработки. Так что на мой взгляд СуммаПредыдущих в сообщении 13104200 был не прав. Теоретически сценарий описанный им возможен, но я ни разу не встречался с подобным в реальности.
Но вот на прошлой неделе мне пришлось обработать несколько миллионов записей в поиске среднего статистического ... И я очень-очень-очень горевал что мне приходится это делать в ASE а не в IQ. OLAP функции может быть и идут вразрез с моделью хранения неупорядоченных данных, но зато они очень облегчают реальную жизнь.
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37942048
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот почитайте например об одном очень полезном нововведении: row pattern matching
Оно как раз реализовано как расширение window-функций.
http://iablog.sybase.com/paulley/2008/04/sql-row-pattern-matching/

Насчет вытащить на эксель. Обрабатывать данные в декларативном стиле намного проще и быстрее, чем трахаться с каким-то клиентами, примитивными императивными средствами обработки данных там. Потом чуть что - перекомпилируй этого клиента. Не, полная фигня.
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37942171
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 09/03/2012 12:49 PM, СуммаПредыдущих wrote:

> И что вы предлагаете?

Я уже говорил, такое надо делать на клиенте.
Есть всякие эксели, всякие отчётные системы типа fast report, Crystall report и
т.д, они всё это умеют делать очень хорошо.

> допустим, мне на некоем участке обработки данных необходимо посчитать
> нарастающий итог.
> Примем, что я считаю, что это не SQL-ная задача.
> То есть, я должен выгрузить полученные данные во внешнюю систему, там написать
> некий обработчик, а затем повторно из загрузить обратно, так как результат был
> только промежуточным, и требуется его дальнейшая обработка средствами SQL. Так?

Нарастающий итог тебе в БД не нужен.
Он нужен для представления информации людям.
Или у тебя бизнес-логика на это завязана ? Очень сомневаюсь.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37942175
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Насчет вытащить на эксель. Обрабатывать данные в декларативном стиле намного
> проще и быстрее, чем трахаться с каким-то клиентами, примитивными императивными
> средствами обработки данных там. Потом чуть что - перекомпилируй этого клиента.

Так в конце концов, если это надо делать в БД, -- есть средсва, курсоры.
Только не SQL.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37942214
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
> Насчет вытащить на эксель. Обрабатывать данные в декларативном стиле намного
> проще и быстрее, чем трахаться с каким-то клиентами, примитивными императивными
> средствами обработки данных там. Потом чуть что - перекомпилируй этого клиента.

Так в конце концов, если это надо делать в БД, -- есть средсва, курсоры.
Только не SQL.
Ну почему сразу "только не SQL"? Вполне себе SQL и даже без курсоров. Одним SQL-92 можно обойтись и без больших проблем. Добавляешь поле-счетчик, обновляешь его через sum() или count() как уже показано 13072960 и все.
Хотя с OLAP все равно жить легче :)
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37943626
похоже, для некоторых это уже религия.
кто-то не приемлет нарастающий итог(вот уж никогда бы не подумал, что это не SQL-задача)
кому-то претят сортировки(!)на уровне сервера(уж они-то часто нужны не только для вывода итогового датасета. взять хотя бы предложение считать нарастающий итог курсором :) )

я же вот не понимаю, зачем создавать лишние потоки данных сервер-клиент-сервер ради какой-то идеологии. тем более, как справедливо заметил White Owl, данных для передачи на клиента может оказаться очень много. а что если при этом клиент и сервер соединены каким-нибудь 64-Кбитным каналом?
По мне, так на клиенте должна производиться только "шлифовка" данных. приделывание рюшечек, сортировка отображения, форматирование вывода.
не более того. все остальное должен уметь сервер.
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37943636
MasterZivЕсть всякие эксели, всякие отчётные системы типа fast report, Crystall report и
т.д, они всё это умеют делать очень хорошо.


кстати, встретился мне случай у заказчика.
Crystal Reports, которому была отведена роль всего лишь формировать csv-шник по готовому датасету из процедуры, преспокойненько падал при попытке захавать более 100 тысяч строк.
И это ему еще не поручили сортировки-группировки и прочие прелести, милостиво оставив их на уровне сервера.
вот тебе и "очень хорошо"
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37945507
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Crystal Reports, которому была отведена роль всего лишь формировать csv-шник по
> готовому датасету из процедуры, преспокойненько падал при попытке захавать более
> 100 тысяч строк.
> И это ему еще не поручили сортировки-группировки и прочие прелести, милостиво
> оставив их на уровне сервера.
> вот тебе и "очень хорошо"

0) 100 тыщ строк -- не задача для отчётника. Ему неск. десятков тыщ.
1) Кристал говно. Это продукт написанный идиотами. Немудрено.
Мне блин его пришлось хакать только чтобы он просто к БД коннектился.
2) Нафига там вообще отчётник, если это делает BCP или утилитку саммому
можно написать за 3 дня ?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37945547
MasterZiv,
что ж такое!
1. SQL для нарастающего итога нельзя, так как это не его задача
2. кристал - не пойдет, объемы не те
3. BCP тоже вряд ли его посчитает. ;)

писать утилиту/дорабатывать клиента? и так под каждый отчет? а если их десятки, и каждый со своими "не-SQL" заморочками?
а если пользователи территориально разбросаны? еженедельно рассылать обновления клиентской части? и держать штат региональных ИТ-специалистов.
жесть какая-то! зато принципы...
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37947248
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача думаю вполне SQL - analytics, нарастающий итог ("running totals"). По большому счету предпочел бы все на SQL делать
(Пропавший без вести Jim Gray работал над этим BTW)
На эту тему и близлезащие (Running Average (sum->avg), Running multiplication (sum->"mult"), Clipping (Set without smallest, greatest), Unique numbering of rows (sum -> count), Statistical median, Financial median, etc..)
довольно обширная литература начиная по-видимому с классической работы "Optimizing Transact SQL: Advanced Programming Technique" by David Rozenstein PH.D, Anatoly Abramovich, Ph.D, Eugene Birger Ph.D (SQL Forum Press, 1995).
(также Joe Celko books like "SQL for Smarties", "Analytics and OLAP in SQL"; "Transact-SQL Cookbook" by Alek Spetic and Jonathahn Gennick 2002 O'Reilly; "SQL Cookbook" O'Reilly by Anthony Molinaro )

B "продвинутых СУБД" (в этом смысле) типа Sybase ASA, Sybase IQ, Oracle, DB2, MS SQL Server 2012, PostGres, решается в настоящее время с помощью "window functions" - используя "over", "row-number", etc... как было упомянуто в предыдущих постах или встроенной olap function.
B Sybase ASE можно использовать
1. Correlated subquery in select list (как было упомянуто) c <=
2. Self-Join по <=

У меня получалось на ASE 12.5, 15.0.3 1. быстрее чем 2. ( 5 Reads vs 32/24 Reads) на примере типа:
(большие обьемы не обсуждаются + такие задачки часто задают на интервью (обычно на self-join <=), сам заинтересовался после одного проваленного )
Код: sql
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.
40.
41.
42.
drop table #t
go
create table #t(k int, v int)
go
insert #t values (1, 10)
go
insert #t values (2, 20)
go
insert #t values (3, 30)
go
insert #t values (4, 40)
go
select * from #t
go
-- Join 
select t1.k, t1.v, sum(t2.v)
from #t t1
    join #t t2
        on t2.k <= t1.k
group by t1.k
go
select x.k, x.v, sum(y.v)
from #t x
    join #t y
        on y.k <= x.k
group by x.k, x.v
go
-- Subquery
select x.k, x.v, (select sum(y.v) from #t y where  y.k <= x.k)
from #t x
--group by x.k
go
-- Multiplication 
select t1.k, exp(sum(log(t2.v)))
from #t t1
    join #t t2
        on t2.k <= t1.k
group by t1.k
go

--drop table #t
--go
...
Рейтинг: 0 / 0
Сумма предыдущих значений
    #37947250
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да на 15.0.3: 5 reads vs 14/10 reads
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Сумма предыдущих значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]