【问题标题】:How to get the sum of rows then get the average of the calculate sum如何获得行的总和然后获得计算总和的平均值
【发布时间】:2019-09-23 16:16:00
【问题描述】:

我有一个代表音乐商店数据的数据库。 我想使用的表是(艺术家、专辑、曲目) 每张专辑都有一个专辑ID、标题和艺术家ID 每首曲目都有 TrackID、Milliseconds、albumID 和 name

嗯,你知道每张专辑都有很多曲目 我想计算专辑中所有歌曲的总和(以毫秒为单位)然后得到该总和的平均值以获得长度高于平均值的专辑。

我设法计算了每张专辑的长度,但我很难得到平均值。

我想生成一个这样的表。

---------------------------------------------------------------------
AlbumID  |  Tile  |  Milliseconds
---------------------------------------------------------------------
1-       |        |
2-       |        |
3-       |        |
...
10-      |        |
----------------------------------------------------------------------

Track样本表

TrackID  |      Name        | AlbumId | Milliseconds
1   For Those About To Rock      1         343719
6   Put The Finger On You        1         205662
7   Let's Get It Up              1         233926
85  Cochise                      10        222380
86  Show Me How to Live          10        277890
87  Gasoline                     10        279457
88  What You Are                 10        249391
89  Like a Stone                 10        294034
99  Your Time Has Come           11        255529
100 Out Of Exile                 11        291291
101 Be Yourself                  11        279484
102 Doesn't Remind Me            11        255869
111 Money                        12        147591
112 Long Tall Sally              12        106396

所以,限制 10 和轨道的长度

【问题讨论】:

  • 使用avg()?如果这还不够,请展示一个示例表(如 create table/insert 语句,以便轻松复制和粘贴)和您想要的结果。
  • 你试过什么?你看过聚合函数吗?我们不是为你做作业。你用的是什么数据库?什么是“瓷砖”?你想要 10 的哪个限制?
  • guys avg() 函数不能像 avg(t.milliseconds) 那样直接以毫秒为单位工作。因为在 Track 表上,我有许多具有相同专辑 ID 的曲目,所以我必须先将它们相加。
  • @danblack 我试过 ``` SELECT al.AlbumId, al.Title, sum(t.milliseconds) as allsum FROM Album al JOIN Track t on al.AlbumId=t.AlbumId GROUP by al .AlbumId HAVING allsum >= avg(allsum) LIMIT 10; ```
  • MySQL SQLite,我建议您编辑问题并仅标记您正在使用的数据库系统,如果您正在寻找适用于 SQLite 和 MySQL 的查询,您可以理想地删除这两个标签作为sql 标签或多或少用于跨数据库平台查询,因为该标签适用于 ANSI/ISO 有效的 SQL 查询。

标签: sqlite


【解决方案1】:

我相信以下可能是您想要的:-

WITH albumsums(id,asum) AS (
    SELECT albumid, sum(milliseconds) 
    FROM track 
    GROUP BY albumid
)
SELECT album.albumid, album.title, asum 
FROM album 
JOIN albumsums 
    ON album.albumid = albumsums.id  
WHERE asum > (SELECT avg(asum) FROM albumsums)
LIMIT 10;

考虑以下演示:-

DROP TABLE IF EXISTS track;
DROP TABLE IF EXISTS artist;
DROP TABLE IF EXISTS album;
CREATE TABLE IF NOT EXISTS track (trackid INTEGER PRIMARY KEY, name TEXT, milliseconds INTEGER, albumid);
CREATE TABLE IF NOT EXISTS artist (artistid INTEGER PRIMARY KEY, artistname TEXT);
CREATE TABLE IF NOT EXISTS album (albumid INTEGER PRIMARY KEY, title TEXT, artistid INTEGER);
INSERT INTO artist (artistname) VALUES ('Pink Floyd'),('Genesis'),('Deep Purple');
INSERT INTO album (title,artistid) VALUES('Dark side of the moon',1),('Fireball',3),('Foxtrot',2);
INSERT INTO track (name,milliseconds,albumid) VALUES
    ('Supper''s Ready',((22 * 60) + 57) * 1000,3),
    ('Watcher of the Skies',((7 * 60) + 21) + 1000,3),
    ('Time Table',((4 * 60) + 47) * 1000,3),
    ('Get ''Em Out by Friday',((8 * 60) + 35) * 1000,3),
    ('Can-Utility and the Coastliners',((5 * 60) + 45 ) * 1000,3),
    ('Speak to me /Breath',((3 * 60) + 58) * 1000,1),
    ('On the Run',((3 * 60) + 35) * 1000,1),
    ('Time',((7 * 60) + 5) * 1000,1),
    ('The Great Gig in the Sky',((4 * 60) + 44) * 1000,1),
    ('Money',((6 * 60) + 23) * 1000,1),
    ('Use and Them',((7 * 60) + 50) * 1000,1),
    ('Any Colour you Like',((3 * 60) + 26) * 1000,1),
    ('Brain Damage',((3 * 60) + 47) * 1000,1),
    ('Fireball',((3 * 60) + 24) * 1000,2),
    ('No No No',((6 * 60) + 54) * 1000,2),
    ('Demon''s Eye',((5 * 60) + 21) * 1000,2),
    ('Anyone''s Daughter',((4 * 60) + 43) * 1000,2),
    ('The Mule',((5 * 60) + 21) * 1000,2),
    ('Fools',((8 * 60) + 19) * 1000,2),
    ('No One Came',((6 * 60) + 34) * 1000,1),
    ('Strange Kind of Woman',((4 * 60) + 07) * 1000,1)
;
SELECT * FROM artist;
SELECT * FROM album;
SELECT * FROM track;

SELECT albumid, sum(milliseconds) 
    FROM track 
    GROUP BY albumid
;

WITH albumsums(id,asum) AS (
    SELECT albumid, sum(milliseconds) 
    FROM track 
    GROUP BY albumid
)
SELECT album.albumid, album.title, asum, (SELECT avg(asum) FROM albumsums AS album_average_for_demo)
FROM album 
JOIN albumsums 
    ON album.albumid = albumsums.id  
WHERE asum > (SELECT avg(asum) FROM albumsums);

最终结果(如您所愿高于平均水平)仅比平均水平高出一张专辑:-

前面的查询演示的 CTE(通用表表达式专辑总和)生成 3 行(每个专辑 1 行),其中包含专辑 ID 和曲目总和:-

因此,平均专辑长度为 2552147,因此只有 1 张专辑大于该长度(正如从如此有限的数据量中预期的那样)。

表格(加载后)是:-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多