1

假设我有下一张桌子:

+------------+---------+
|    MovieId |  rating  |
+------------+---------+
|      1     |     4   |
|      1     |     3   |
|      1     |     2   |
|      1     |     4   |
|      1     |     5   |
|      2     |     3   |
|      2     |     4   |
|      2     |     2   |
|      3     |     1   |
|      3     |     2   |
|      3     |     3   |
|      3     |     5   |
|      4     |     4   |
|      4     |     2   |
+------------+---------+

我想使用每组的前 2 个元素按组获得平均值。
例子:

+------------+---------+
|    MovieId |  rating  |
+------------+---------+
|      1     |     4   |
|      1     |     3   |
|      2     |     3   |
|      2     |     4   |
|      3     |     1   |
|      3     |     2   |
|      4     |     4   |
|      4     |     2   |
+------------+---------+

预期答案:

+------------+---------+
|    MovieId |  AVG    |
+------------+---------+
|      1     |     3.5 |
|      2     |     3.5 |
|      3     |     1.5 |
|      4     |     3   |
+------------+---------+

这是我必须获取所有电影的 AVG 的 SQL 查询。但正如我所说,我只想为每个组使用前 2 个元素。

SELECT movieid, AVG(cast(rating as DECIMAL(10,2))) AS AVG FROM ratings group by movieid

如果你能帮助我制作我欣赏的 SQL。我也会使用 Linq,以防你们中的一些人知道它。

4

3 回答 3

0

在 SQL DBMS 中——就像在关系模型中一样——没有“第一”。您是指每部电影的任意 2 行,还是两个最高收视率,还是其他?

如果你不能定义一个订单,那么查询是没有意义的。

如果您可以定义订单,请按照我在规范示例中显示的那样将表格连接到自身以创建排名,然后选择where RANK < 3.

于 2013-04-21T04:13:21.343 回答
0

对于 MySQL:-

select id, avg(rating) 
from (SELECT a.*, @num := @num + 1 rownum,
        (select count(*) 
         from movies m 
         where m.id<=a.id) last_count,

        (select count(*) 
         from movies m1 
         where a.id=m1.id) grp_count 
      from movies a, (SELECT @num := 0) d) f  
where grp_count-(last_count-rownum)<=2 
group by id;

你可以rownum在oracle中使用函数。并row_number()在 sql server 中运行。

于 2013-04-21T04:15:48.000 回答
-1

这是 SQL 中的解决方案

Create table #tempMovie (movieId int ,rating int)

INSERT INTO #tempMovie
Select  *  from table where movieidid=1 Limit 2
Union all
Select *  from table where movieidid=2 Limit 2
Union all
Select *  from table where movieidid=3 Limit 2
Union all
Select  *  from table where movieidid=4 Limit 2

临时表#tempmovie 表将包含这样的数据

+------------+---------+
|    MovieId |  rating  |
+------------+---------+
|      1     |     4   |
|      1     |     3   |
|      2     |     3   |
|      2     |     4   |
|      3     |     1   |
|      3     |     2   |
|      4     |     4   |
|      4     |     2   |
+------------+---------+

然后应用分组

Select movieId, AVG(rating)
from #tempMovie
Group by movieId

Drop table #tempmovie
于 2013-04-21T03:44:56.253 回答