2011-02-13 78 views
0

我试图获得最后两条记录的平均值并按名称对它们进行分组。SQL查询-AVG过去两天

OId  ODate  Value  Name 
1  05/01/2011 25   Mike 
2  05/01/2011 56  Peter 
3  05/01/2011 09  Robert 
4  06/01/2011 21   Mike 
5  06/01/2011 52  Peter 
6  06/01/2011 04  Robert 
7  10/01/2011 28   Mike 
8  10/01/2011 57  Peter 
9  10/01/2011 03  Robert 

SELECT Name, avg(Value) as avg_score 
FROM (
    SELECT Name, Value FROM S_ORDER BY dessc ODate 60 
) 
GROUP BY Name; 

谢谢。

+0

最后2周每个姓名的日期? – 2011-02-13 13:49:12

+1

您使用的是什么RDBMS? – 2011-02-13 13:50:29

+0

谢谢!每个姓名的最后2个日期? - 是 \t 您使用的是什么RDBMS? - Mysql – web21 2011-02-14 00:27:46

回答

1
SELECT tLast.Name, 
    (tLast.Value + COALESCE(tLast2.Value, 0))/CASE WHEN tLast2.Value IS NULL 1 ELSE 2 END As avg_score 
FROM (
    SELECT last1.Name, MAX(last1.MaxID) MaxID, MAX(last2.OId) MaxID2 
    FROM (
     SELECT Name, MAX(OId) MaxID 
     FROM tableName 
     GROUP BY Name 
    ) last1 LEFT JOIN tableName last2 ON Name = last1.Name AND OId < last1.MaxID 
    GROUP BY last1.Name 
) rs JOIN tableName tLast ON rs.MaxID = tLast.OId 
    LEFT JOIN tableName tLast2 ON rs.MaxID2 = tLast2.OId 
ORDER BY tLast.Name 

按名称分组不建议,你应该存储user_id指向一个user表,而不是存储的名称。

1

这将是一个标准的ANSI SQL的解决方案:

 
SELECT Name, avg(Value) as avg_score 
FROM (
    SELECT Name, 
     Value, 
     row_number() over (partition by name order by Odate desc) as row_num 
    FROM your_table 
) t 
GROUP BY Name 
WHERE row_num <= 2;