从带有last.fm乱码的mysql表中查找给定年份的前100名[重复]

Posted

技术标签:

【中文标题】从带有last.fm乱码的mysql表中查找给定年份的前100名[重复]【英文标题】:Finding Top-100 of a given year from a mysql table with last.fm scrobbles [duplicate] 【发布时间】:2021-03-19 07:06:55 【问题描述】:

我将一个生成的 CSV 文件导入到 MariaDB 表中,by this tool 带有我所有的 last.fm scrobbles,CREATE 脚本如下:

CREATE TABLE `scrobbles` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `artist` VARCHAR(128) NULL DEFAULT '',
    `album` VARCHAR(128) NULL DEFAULT '',
    `title` VARCHAR(128) NULL DEFAULT '',
    `datahora` DATETIME NULL DEFAULT current_timestamp(),
    PRIMARY KEY (`id`)
)ENGINE=InnoDB;

我想知道如何获得给定年份中执行次数最多的曲目(基本上是标题+艺术家组合重复次数最多的曲目),按每首曲目的播放/乱码数排序。

【问题讨论】:

【参考方案1】:

如果你想要这一年,你可以聚合、排序和限制:

select artist, album, title, count(*) cnt
from scrobbles
where datahora >= '2019-01-01' and datahora < '2020-01-01'
group by artist, album, title
order by count(*) desc limit 100

我将专辑添加到 group by 子句中,因为人们可能会期望不同专辑的同音标题。

如果您想同时使用多年,那么我会推荐窗口函数:

select *
from (
    select artist, album, title, year(datahora) yr, count(*) cnt,
        rank() over(partition by year(datahora) order by count(*) desc) rn
    from scrobbles
    group by artist, album, title
) t
where rn <= 100
order by yr, cnt desc

这种方法的另一个好处是它允许打底;如果碰巧在最后一个位置有关系,它每年可能会返回 100 多行。

【讨论】:

非常感谢!我将把你的第一个剪掉并删除“专辑”,因为需要对“同音词标题”进行分组(由于 Last.fm 处理专辑的方式)。我会尽快将您的答案标记为已接受!

以上是关于从带有last.fm乱码的mysql表中查找给定年份的前100名[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Last.fm java.lang.ClassCastException - 从文件中读取用户对象

从 Last.fm API 到 Python 中的 UTS 到 DateTime [重复]

如何从 sql server 2008 中具有不同 TaskIds 的表中查找日期?

Mysql Select Query 以查找在两个给定日期之间也部分空闲的项目

php Last.fm简单的PHP类

大多数 last.fm 艺术家图像丢失(回声 api)