SQL - подсчитать сгруппированные записи и затем получить максимальные значения, сгруппированные по дате - PullRequest
2 голосов
/ 16 июня 2010

У меня есть таблица 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 ... Имея метод проб и ошибок, я читаю примеры подобных проблем, но всегда теряюсь в именах столбцов и прочем (я немного перегорел)

Я надеюсь, что кто-то можетдай мне подсказку.спасибо м

Ответы [ 2 ]

1 голос
/ 16 июня 2010

Это именно то, что происходит.Я даже не ожидал бы, что этот запрос будет выполнен - ​​поскольку у вас есть «имя исполнителя» в предложении 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)
0 голосов
/ 17 июня 2010

Я нашел способ после прочтения этого: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ Но это кажется глупым, и, возможно, кто-то может дать подсказку, как это оптимизировать.

Я создал sqlite view с именем 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

затем я запрашиваю представление со следующим утверждением

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

это дает мне желаемый результат.

...