SQL - 从平均值中选择id

时间:2013-01-12 08:56:32

标签: java sql database hsqldb

我的表是:

CREATE TABLE Rating
(
    rid INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    mid INTEGER FOREIGN KEY REFERENCES Movie(movieId) ON DELETE CASCADE, 
    uid INTEGER FOREIGN KEY REFERENCES User(id) ON DELETE CASCADE,
    rating INTEGER NOT NULL, 
);

我想选择平均评分最高的中间人:

select avg(r.rating) from rating r
巫婆回归平均值。我想以最高的平均评分返回中期。任何想法如何做到这一点?

>更新

其他两个表:

CREATE TABLE User(
    id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    passwordhash VARCHAR(100) NOT NULL,
    fullname VARCHAR(50) NOT NULL,
    birthday DATE NOT NULL,
    joindate DATE NOT NULL,
    email VARCHAR(50) NOT NULL,
    picturepath VARCHAR(256) NOT NULL,
    favouritemovie VARCHAR(50) NOT NULL,
    favouritecategory INTEGER REFERENCES category(id),
    isDeleted BOOLEAN NOT NULL
);

CREATE TABLE Movie
(
    movieId INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    moviePath VARCHAR(500) NOT NULL
);

3 个答案:

答案 0 :(得分:1)

来自您的评论:

  

计算每个mid的平均评分(使用GROUP BY mid),然后选择maximum并返回mid

首先,计算每个中期的平均值:

select mid, 
       avg(rating) as avg_rating
from rating
group by mid;

现在选择最大值:

select max(avg_rating)
from (
  select avg(rating) as avg_rating
  from rating
  group by mid
) as mar

现在结合这些:

select ar.mid, mar.max_avg
from (
    select mid, 
           avg(rating) as avg_rating
    from rating
    group by mid
  ) as ar
  join (
    select max(avg_rating) as max_avg
    from (
      select avg(rating) as avg_rating
      from rating
      group by mid
    ) as t
  ) as mar
  on ar.avg_rating = mar.max_avg;

SQLFiddle示例(使用Postgres,但也适用于HSQLDB):http://sqlfiddle.com/#!12/e208a/8

这不是最简单的解决方案,但从不对分组数据进行查询。使用Luther所示的TOP结构会更快。 TOP 1的唯一缺点是你不会注意到两部电影的平均评分是否相同。

编辑:只是扩展一点HSQLDB。在支持窗口函数的数据库(PostgreSQL,Oracle和许多其他)中,这类问题非常简单:

select *
from (
  select mid, 
         avg(rating) as avg_rating,
         dense_rank() over (order by avg(rating) desc) as rnk
  from rating
  group by mid
) t
where rnk = 1;

特别容易找到第二高,第三高等等(where rnk = 2where rnk = 3)使用这些嵌套查询真的很复杂 - 但使用{{时更轻松一点1}} aproach。

答案 1 :(得分:0)

可能是这样的:

SELECT TOP 10
  mid,
  avg(cast(r.rating as float))
FROM Rating r
GROUP BY mid
ORDER BY avg(cast(r.rating as float)) DESC

你不需要将评级更改为浮点数,但我认为如果你有4 anf 5的等级,你可能希望平均值为4.5而不是仅仅四舍五入为。

答案 2 :(得分:0)

你说你想从大多数平均评级中选择中频。试试这个......

select max(x.avgr)
from (
  select r.mid, avg(r.rating) avgr
  from rating r
  group by r.mid
) as x;

或尝试此操作:适用于Sql Server

select Top 1 r.mid, avg(r.rating) as avgr
from rating r
group by r.mid
order by avgr desc
;

那些Top不起作用的dbms可能会使用limit 1代替..

    select r.mid, avg(r.rating) as avgr
    from rating r
    group by r.mid
    order by avgr desc Limit 1
    ;
相关问题