2012-06-13 1 views
0

У меня есть несколько операторов SQL, которые вычисляют средние значения в хранимой процедуре:Выбор средние с пределом

SELECT AVG(x) INTO _5dayaverage FROM (SELECT x FROM my_data ORDER BY create_date DESC LIMIT 5) AS temptable; 
SELECT AVG(x) INTO _10dayaverage FROM (SELECT x FROM my_data ORDER BY create_date DESC LIMIT 10) AS temptable; 

Можно ли написать их таким образом, что я только делать ОТБОРНОЕ один раз вместо используя производную таблицу? Поскольку мне нужно рассчитать средние значения для 5, 10, 20, 28, 30, 35 и 50 дней, возможно ли сделать все это в рамках одного запроса вместо того, чтобы делать SELECT снова и снова?

+1

Является ли это MySQL или SQL Server? Я не думаю, что это должно быть отмечено как. –

+0

Это MySql, но люди SQL Server также могут внести свой вклад. – Zishan

+1

Почему? Если ответ отличается для SQL Server, будет ли он действительным? Вы собираетесь использовать ответ, например, опубликованный @LeviW? Если нет, вы потратили свое время. –

ответ

4

Вам нужно использовать увеличивающиеся переменную, чтобы получить RowNumber в MySQL:

SELECT AVG(CASE WHEN RowNumber <= 5 THEN X END) AS Avg_5, 
     AVG(CASE WHEN RowNumber <= 10 THEN X END) AS Avg_10, 
     AVG(CASE WHEN RowNumber <= 15 THEN X END) AS Avg_15, 
     AVG(CASE WHEN RowNumber <= 20 THEN X END) AS Avg_20, 
     AVG(CASE WHEN RowNumber <= 25 THEN X END) AS Avg_25, 
     AVG(CASE WHEN RowNumber <= 30 THEN X END) AS Avg_30, 
     AVG(CASE WHEN RowNumber <= 35 THEN X END) AS Avg_35 
FROM ( SELECT @i:= @i + 1 AS RowNumber, x 
      FROM My_Data, 
        (SELECT @i:=0) AS i 
      ORDER BY Create_Date DESC 
     ) AS Data 

http://sqlfiddle.com/#!2/7a250/1

+0

Отлично! Благодаря! – Zishan

4

Вы можете использовать ROW_NUMBER() с общим табличным выражением. Предполагая, что вы используете SQL Server 2005+

WITH Numbered AS (
SELECT ROW_NUMBER() OVER(ORDER BY create_date DESC) AS RowNum, 
    X 
FROM my_data) 

SELECT AVG(CASE WHEN RowNum <= 5 THEN X ELSE NULL END) AS _5_Day_Avg, 
    AVG(CASE WHEN RowNum <= 10 THEN X ELSE NULL END) AS _10_Day_Avg 
FROM Numbered 
+0

+1 за то время, которое вы потратили впустую здесь. –

 Смежные вопросы

  • Нет связанных вопросов^_^