Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Расчет среднего значения. [D5, D7]


Страницы:   1 2

Neket ©   (2007-11-17 13:17:00) 

Как расчитать среднее только по первым двум значениям? Т.е. Имеется к примеру такая табличка:

Name   |   Value | Date
Name1 |   15      | 15.07.2006
Name1 |   14      | 20.07.2006
Name1 |   11      | 12.07.2006
Name1 |   7        | 11.07.2006
Name2 |   45      |  01.07.2006
Name2 |   37      |  06.07.2006
Name2 |   25      |  16.07.2006
Name2 |   18      |  26.07.2006
..... ну и так далее


И как теперь вычислить среднее значение AVG только первых двух значений. Т.е. чтобы была к примеру такая табличка

Name   |   Value_AVG
Name1 |        14.5
Name2 |        41
..... ну и так далее


P.S. Подозреваю что необходимо использовать аналитический функции, но к сожалению я с ними очень не знаком поэто му решил к вам обратиться. Кто может подскажите пожалуйста :-)


Kolan   (2007-11-17 16:11:00) [21]

Иными словами:

DECLARE @MaxValue int;
DECLARE @SecondFromMax int;

SET @MaxValue = SELECT Max(Value) FROM Table;
SET @SecondFromMax = SELECT Max(Value) FROM Table WHERE Value <> @MaxValue;

SELECT * FROM Table
WHERE (Value = @MaxValue) OR (Value = @SecondFromMax)


Kolan   (2007-11-17 16:06:00) [22]

Может так:


SELECT * FROM Table
WHERE
    (Value = (SELECT Max(Value) FROM Table))
 OR (Value = (
      SELECT Max(Value) FROM Table WHERE Value (SELECT Max(Value) FROM Table)))


Это идея…


Neket   (2007-11-17 16:03:00) [23]

Да все верно... В оракле самый простой способ это написать процедуру, но задача состоит имено в том чтобы вычислить значения при помощи обычного select-а.


Kolan   (2007-11-17 15:46:00) [24]

Если я правильно понимаю задачу, то тебе надо научится выбирать две верхние строки в отсортированном наборо данных. Как сделать это в ORACLE я незнаю. Но точно уверен, что это можно сделать написав соотв хрон процедуру. Кажется в ORACLE язык называется PL SQL. Но(!) в правильности такого решения я не уверен…


Neket   (2007-11-17 15:22:00) [25]

Можно даже не много перфразировать задачу...
Как имея такую таблицу:
tabel1
Name   |   Value | Date
Name1 |   15      | 15.07.2006
Name1 |   14      | 20.07.2006
Name1 |   11      | 12.07.2006
Name1 |   7        | 11.07.2006
Name2 |   45      |  01.07.2006
Name2 |   37      |  06.07.2006
Name2 |   25      |  16.07.2006
Name2 |   18      |  26.07.2006
..... ну и так далее
получить такую
Table2
Name   |   Value | Date
Name1 |   15      | 15.07.2006
Name1 |   14      | 20.07.2006
Name2 |   45      |  01.07.2006
Name2 |   37      |  06.07.2006
..... ну и так далее

Т.е. Чтобы выводились только первые два значения каждого name из table1


Neket   (2007-11-17 14:55:00) [26]

Oracle.... SELECT TOP N не прокатит


Kolan   (2007-11-17 14:50:00) [27]

> И необходимо вычислить среднее значния дву максимальных
> значений value за четыре недели.

Вот и савтено условие.

Какая СУБД? SQL Server 2005 съест SELECT TOP N(кажется)…


Neket   (2007-11-17 14:21:00) [28]

Дело в том что даты могут быть разными а слолбец value отсортирован по убыванию. И задача посчитать среднее первых двух максимальных значений.
Т.е. Даты могуть быть абсолютоно разными... Это я писал для примера...
У меня есть селект который выбирает максимальные значения VALUE за месяц по недельно. И необходимо вычислить среднее значния дву максимальных значений value за четыре недели. Витеевато наверное объяснил. Извините. :-)


sniknik   (2007-11-17 14:12:00) [29]

> а задача стоит в том чтобы расчитать только по первым двум значениям.
значит подбери условие которое отбирает только первые два... (по какому признаку первые?... порядковые номера так эфемерны, и обманчивы...)

> Т.е. NAME1 только за 15.07.2006 и 20.07.2006, NAME2 только за 11.07.2006 и 01.07.2006
ну вот как вариант и пиши это в условии отбора, только в SQL -
WHERE Name='Name1' AND Date=... и тд....


Kolan   (2007-11-17 14:09:00) [30]

> по первым двум значениям

Ну сделайте нужный SELECT.

SELECT * FROM Table
WHERE (Date = '2006-07-15') OR (…)


А уже этот SELECT — см. [1]


Neket   (2007-11-17 13:35:00) [31]

Да но в это случае расчет среднего будет произодиться по всем четырем начениям, а задача стоит в том чтобы расчитать только по первым двум значениям. Т.е. NAME1 только за 15.07.2006 и 20.07.2006, NAME2 только за 11.07.2006 и 01.07.2006


Kolan   (2007-11-17 13:30:00) [32]

Нужно сгрупировать.

Table:
Name   |   Value | Date
Name1 |   15      | 15.07.2006
Name1 |   14      | 20.07.2006
Name1 |   11      | 12.07.2006
Name1 |   7        | 11.07.2006
Name2 |   45      |  01.07.2006
Name2 |   37      |  06.07.2006
Name2 |   25      |  16.07.2006
Name2 |   18      |  26.07.2006


SELECT Name, AVG(Value) AS Value_AVG
FROM Table
Group BY Name


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо