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

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

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

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

Если писать Sum в лоб, то он считает сумму всего столбца и плевать он хотел, что это временная таблица, которая в этот момент и создается.
Так посчитать вообще реально?
...
Рейтинг: 0 / 0
27.08.2012, 23:24
    #37932661
Сумма предыдущих значений
SamantaBlack,
а как у Вас именно приведенные цифры получаются?
...
Рейтинг: 0 / 0
27.08.2012, 23:29
    #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
28.08.2012, 01:55
    #37932748
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сумма предыдущих значений
> табличка отсортированная по столбцам Имя и Дата, а вот с заполнением столбца
> Сумма у меня загвоздка. В этом столбце должна быть сумма всех предыдущих
> значений для столбца Значение. То есть примерно так:

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

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


Если вы не знаете, как решить задачу, это не делает ее фигней. Задачка вполне реальна и благодаря помощи людей, сегодня утром я закрыла проект. ^^ А посылать в эксеот грубо, толсто и не смешно, видимо вы сами все решаете в экселе.
...
Рейтинг: 0 / 0
28.08.2012, 14:17
    #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
29.08.2012, 15:12
    #37935519
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сумма предыдущих значений
> Если вы не знаете, как решить задачу, это не делает ее фигней. Задачка вполне
> реальна и благодаря помощи людей, сегодня утром я закрыла проект. ^^ А посылать
> в эксеот грубо, толсто и не смешно, видимо вы сами все решаете в экселе.

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

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.08.2012, 20:02
    #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
01.09.2012, 19:54
    #37940070
Сумма предыдущих значений
MasterZivЭто ты должен прежде всего понимать, какими средствами какие задачи надо решать.
И использовать подходящие. А ты видимо недогоняешь...

а что, нарастающий Этог - задача, непосильная для SQL?
...
Рейтинг: 0 / 0
02.09.2012, 21:58
    #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
03.09.2012, 11:44
    #37941006
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сумма предыдущих значений
> а что, нарастающий Этог - задача, непосильная для SQL?

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

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

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

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

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

Насчет вытащить на эксель. Обрабатывать данные в декларативном стиле намного проще и быстрее, чем трахаться с каким-то клиентами, примитивными императивными средствами обработки данных там. Потом чуть что - перекомпилируй этого клиента. Не, полная фигня.
...
Рейтинг: 0 / 0
04.09.2012, 00:19
    #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
04.09.2012, 00:21
    #37942175
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сумма предыдущих значений
> Насчет вытащить на эксель. Обрабатывать данные в декларативном стиле намного
> проще и быстрее, чем трахаться с каким-то клиентами, примитивными императивными
> средствами обработки данных там. Потом чуть что - перекомпилируй этого клиента.

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

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

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


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

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

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

писать утилиту/дорабатывать клиента? и так под каждый отчет? а если их десятки, и каждый со своими "не-SQL" заморочками?
а если пользователи территориально разбросаны? еженедельно рассылать обновления клиентской части? и держать штат региональных ИТ-специалистов.
жесть какая-то! зато принципы...
...
Рейтинг: 0 / 0
06.09.2012, 19:03
    #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
06.09.2012, 19:07
    #37947250
Zhora
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сумма предыдущих значений
Да на 15.0.3: 5 reads vs 14/10 reads
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Сумма предыдущих значений / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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