2010-06-16 58 views
2

分组的最高值我有一个SQLite表保持每播放的曲目中的一排打日期/时间 现在我将计算所有艺术家的戏剧,按天分组然后每天以最大playcount找到艺术家。 我用这个查询SQL - 计数分组条目,然后获得通过日期

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" 

我试着再查询该虚拟表,但我总是在ARTISTNAME错误的结果。

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" 

但艺术家的名字是假的。 我想通过一天的分组,它只是用过去的艺术家,还是如此。 我测试状内的东西JOIN或GROUP BY ... HAVING在试错,我读的类似问题的例子,但总是迷失在COLUMNNAMES和东西 (我有点烧坏了)

我希望有人能给我一个提示。感谢中号

回答

1

这正是发生了什么。我甚至不会想到这个查询运行 - 因为你已经得到了“ARTISTNAME” SELECT子句中,但不在GROUP BY,我期望你正在使用的SQL引擎拒绝执行查询。

要解决它,只需添加“ARTISTNAME”你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) 
+0

用艺术家名称再次分组会导致我发布的第一个表格输出。也许我需要第三个选择和“加盟”两种结果^^。 – Marcus 2010-06-16 19:30:32

+0

与MySQL类似,SQLite拥有关于GROUP BY子句的这个“特性”,您不必遵循SQL标准并可以省略列...... – 2010-06-16 19:31:04

+0

这是一个可怕的“特性”,因为它导致了类似的东西。无论如何,将它添加到GROUP BY应该清理问题。 – SqlRyan 2010-06-16 20:31:22

0

我已经找到一种方法看完这个: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ 但感觉愚蠢的,也许有人可以给出一个提示如何优化这个。

我创建一个SQLite 视图称为max_play_by_artist其输出由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 

分组的所有playcounts然后我查询视图与下面的语句

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 

这给了我期望的结果。