2

我有一个 sqlite 表,其中包含播放日期/时间的连续播放曲目现在我将计算所有艺术家的播放次数,按天分组,然后找到每天播放次数最多的艺术家。我使用了这个查询

SELECT COUNT(ARTISTID) AS artistcount,
       ARTIST AS artistname,
       strftime('%Y-%m-%d', playtime) AS day_played
FROM playcount
GROUP BY artistname, day_played

得到这个结果

"93"|"The Skygreen Leopards"|"2010-06-16"
"2" |"Arcade Fire"          |"2010-06-15"
"2" |"Dead Kennedys"        |"2010-06-15"
"2" |"Wolf People"          |"2010-06-15"
"3" |"16 Horsepower"        |"2010-06-15"
"3" |"Alela Diane"          |"2010-06-15"
"46"|"Motorama"             |"2010-06-15"
"1" |"Ariel Pink's Haunted" |"2010-06-14"

然后我尝试查询这个虚拟表,但我总是在艺术家名中得到错误的结果。

SELECT MAX(artistcount), artistname , day_played 
FROM
(
SELECT COUNT(ARTISTID) AS artistcount,
       ARTIST AS artistname,
       strftime('%Y-%m-%d', playtime) AS day_played
FROM playcount
GROUP BY artistname
)
GROUP BY strftime('%Y-%m-%d',day_played)

导致这个

"93"|"lilium"     |"2010-06-16"
"46"|"Wolf People"|"2010-06-15"
"30"|"of Montreal"|"2010-06-14"

但艺术家的名字是假的。我认为通过按天分组,它只使用最后一位艺术家,左右。我测试了诸如 INNER JOIN 或 GROUP BY 之类的东西……在反复试验中,我阅读了类似问题的示例,但总是迷失在列名和其他东西中(我有点筋疲力尽)

我希望有人能给我一个提示。谢谢米

4

2 回答 2

1

这正是正在发生的事情。我什至不希望这个查询运行 - 因为您在 SELECT 子句中有“艺术家名”但在 GROUP BY 中没有,我希望您正在使用的 SQL 引擎拒绝执行查询。

要解决它,只需在外部查询中将“艺术家名”添加到您的 GROUP BY 中:

SELECT MAX(artistcount), artistname , day_played 
FROM
(
SELECT COUNT(ARTISTID) AS artistcount,
ARTIST AS artistname,strftime('%Y-%m-%d', playtime) AS day_played
FROM playcount
GROUP BY artistname
)
GROUP BY artistname, strftime('%Y-%m-%d',day_played)
于 2010-06-16T19:18:23.707 回答
0

阅读此内容后,我找到了一种方法: http ://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ 但它感觉很愚蠢,也许有人可以提示如何优化它。

我创建了一个名为max_play_by_artist的 sqlite视图,它输出按 day_played 分组的所有播放计数

CREATE VIEW "max_play_by_artist"
AS
    SELECT COUNT(artistid) AS artistcount,
    artist AS artistname,
    strftime('%Y-%m-%d', playtime) AS day_played,
    artistid as id
    FROM playcount
    GROUP BY artistid,day_played

然后我使用以下语句查询视图

SELECT b.artistcount, b.artistname, b.day_played, b.id
FROM 
(
    SELECT day_played, MAX(artistcount) as max_count
    FROM max_play_by_artist
    GROUP BY day_played
) AS a
INNER JOIN max_play_by_artist AS b
ON b.day_played = a.day_played
AND b.artistcount = a.max_count

这给了我想要的结果。

于 2010-06-17T07:23:05.073 回答