Как получить сумму строк, а затем получить среднее значение для расчета суммы - PullRequest
0 голосов
/ 06 мая 2019

У меня есть база данных, которая представляет данные музыкального магазина.Таблицы, с которыми я хочу работать: (исполнитель, альбом, дорожка), у каждого альбома есть идентификатор альбома, название и идентификатор исполнителя, и каждая дорожка имеет TrackID, миллисекунды, идентификатор альбома и имя

, так как вы знаете, что у каждого альбома есть много дорожекЯ хочу рассчитать сумму всех песен в альбоме (в миллисекундах). Затем получить среднее значение этой суммы, чтобы получить альбомы, длина которых превышает среднее значение.

Мне удалось рассчитать длину каждого альбома.но я изо всех сил пытался получить среднее значение.

Я хочу сгенерировать таблицу, которая будет такой.

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

Пример таблицы треков

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

так,LIMIT 10 и длина дорожки

1 Ответ

0 голосов
/ 06 мая 2019

Я полагаю, что вы можете пожелать: -

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);

Чистый результат (как вы хотели выше среднего) на один альбом выше среднего: -

enter image description here

CTE (альбомы альбомов Common Table Expression), как показано в предыдущем запросе, создает 3 строки (по 1 на альбом) с идентификатором альбома и суммой треков: -

enter image description here

Таким образом, средняя длина альбома составляет 2552147 и, следовательно, только 1 альбом больше этого (как и следовало ожидать от такого ограниченного количества данных).

Таблицы (после загрузки): -

enter image description here enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...