【问题标题】:Selecting values in SQL by avg(x)通过 avg(x) 在 SQL 中选择值
【发布时间】:2013-01-25 19:35:18
【问题描述】:

我改变了问题,因为我做错了另一部分。我的目标是更新平均 >= 4 的电影的年份信息。但我无法通过他们的平均数列出它们:(

/* Delete the tables if they already exist */
drop table if exists Movie;
drop table if exists Reviewer;
drop table if exists Rating;

/* Create the schema for our tables */
create table Movie(mID int, title text, year int, director text);
create table Reviewer(rID int, name text);
create table Rating(rID int, mID int, stars int, ratingDate date);

/* Populate the tables with our data */
insert into Movie values(101, 'Gone with the Wind', 1939, 'Victor Fleming');
insert into Movie values(102, 'Star Wars', 1977, 'George Lucas');
insert into Movie values(103, 'The Sound of Music', 1965, 'Robert Wise');
insert into Movie values(104, 'E.T.', 1982, 'Steven Spielberg');
insert into Movie values(105, 'Titanic', 1997, 'James Cameron');
insert into Movie values(106, 'Snow White', 1937, null);
insert into Movie values(107, 'Avatar', 2009, 'James Cameron');
insert into Movie values(108, 'Raiders of the Lost Ark', 1981, 'Steven Spielberg');

insert into Reviewer values(201, 'Sarah Martinez');
insert into Reviewer values(202, 'Daniel Lewis');
insert into Reviewer values(203, 'Brittany Harris');
insert into Reviewer values(204, 'Mike Anderson');
insert into Reviewer values(205, 'Chris Jackson');
insert into Reviewer values(206, 'Elizabeth Thomas');
insert into Reviewer values(207, 'James Cameron');
insert into Reviewer values(208, 'Ashley White');

insert into Rating values(201, 101, 2, '2011-01-22');
insert into Rating values(201, 101, 4, '2011-01-27');
insert into Rating values(202, 106, 4, null);
insert into Rating values(203, 103, 2, '2011-01-20');
insert into Rating values(203, 108, 4, '2011-01-12');
insert into Rating values(203, 108, 2, '2011-01-30');
insert into Rating values(204, 101, 3, '2011-01-09');
insert into Rating values(205, 103, 3, '2011-01-27');
insert into Rating values(205, 104, 2, '2011-01-22');
insert into Rating values(205, 108, 4, null);
insert into Rating values(206, 107, 3, '2011-01-15');
insert into Rating values(206, 106, 5, '2011-01-19');
insert into Rating values(207, 107, 5, '2011-01-20');
insert into Rating values(208, 104, 3, '2011-01-02');

这些是表格。

【问题讨论】:

  • 如果你想更新 all 行中的year 列,你的语句是 100% 没问题的。更正:year = year + 25。它可能与引号一起使用(在 SQLite 中),但实际上,当您想添加数字时,请使用数字而不是字符串。
  • 您是单独存储年份,还是年份的一部分或时间戳的一部分?
  • 根据您的输入,您的代码是正确的。
  • 你为什么认为这是错误的?
  • 我觉得这太简单了 :) 我的情况似乎有问题。我这里有一些表格dfiles.eu/files/yntuynaf7.I 需要更新他们的平均评分>= 4 的电影年份。我不能写我猜。

标签: sql sqlite sql-update average


【解决方案1】:

对于一个特定的电影 ID,您可以通过以下查询获得平均评分:

SELECT avg(stars)
FROM Rating
WHERE mID = ?

要更新所有具有特定平均评分的电影,请将上述内容用作子查询:

UPDATE Movie
SET year = year + 25
WHERE (SELECT avg(stars)
       FROM Rating
       WHERE Rating.mID = Movie.mID) >= 4

【讨论】:

    【解决方案2】:

    按照您在问题中编写示例的方式,您将在字段的字符串值末尾添加一个字符串“25”。它也仅适用于字符串(文本)字段,而不适用于数字字段。您的示例将使用例如更改字段“1000”到“100025”的值。您可能想要做的是添加到数值。只需删除示例中的单引号即可。

    UPDATE tableName 
    SET fieldName = fieldName + 25
    

    如果您需要定位特定值,请在示例末尾添加您的标准,例如:

    WHERE fieldName < 1000
    

    并且只会对符合条件的记录进行更改。

    希望这会有所帮助! ;)

    编辑:不再与 OP 更改的问题相关...为了清楚起见,请仅更改问题,不要完全改变它的含义!啊啊啊!!!

    【讨论】:

      【解决方案3】:

      您的代码将更新所有行中的year

      但是就像你说的你想要特定值,你必须在子句WHERE中指定它们:

      UPDATE mytable
       SET year = year + 25
       WHERE condition
      

      condition 可能是

      WHERE mypk > 100
      

      【讨论】:

        【解决方案4】:
        Update TargetTable
        set targetColumn = somevalue
        where PrimaryKey = somevalue
        

        如果您没有主键,则需要找到某种方法来唯一标识该行,否则您将面临更新整个表的风险!

        Msdn page 涵盖了 Update 语句能做什么和不能做什么。

        编辑:

        Update TargetTable
        set targetColumn = TargetColumn + somevalue
        

        这将使所有行增加 25 年

        【讨论】:

        • 不,我不想将它们全部设置为 25。我想将 25 添加到它们的当前值。说 1900 将是 1925。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-23
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        相关资源
        最近更新 更多