2

再生されたすべてのトラックを再生日時と共に一列に保持する sqlite テーブルがあります。ここで、日ごとにグループ化されたすべてのアーティストの再生をカウントし、1 日あたりの最大再生カウントを持つアーティストを見つけます。このクエリを使用しました

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句には「artistname」がありますが、GROUP BYには含まれていないため、使用しているSQLエンジンがクエリの実行を拒否することを期待しています。

これを解決するには、外側のクエリの GROUP BY に「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 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/ しかしそれは愚かだと感じ、おそらく誰かがこれを最適化する方法のヒントを与えることができます。

day_playedでグループ化されたすべてのプレイカウントを出力するmax_play_by_artistというsqliteビューを作成しまし

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 に答える