![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Расчет среднего значения. [D5, D7]
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