2016-03-21 10 views
2

У меня есть таблица stats_by_dates, которая содержит оценку, которая измеряется каждый день для песни. Как найти песни, которые имеют наибольшее увеличение в баллах?Запрос, чтобы найти увеличение с течением времени

Столбцы в этой таблице: id, song_id, date, score.

Это то, что я до сих пор, но это не тихий право:

select song_id, date, score - coalesce(lag(score) over (partition by song_id order by date desc), 0) as delta 
from stats_by_dates 
group by song_id, date, score 
order by score desc limit 100 

Это возвращает 100 лучших песен по баллам вместо 100 лучших песен с наибольшим увеличением балла. Как только я получу эту работу, я также хочу применить запрос, чтобы найти самую быструю восходящую песню за последние 3 дня. Спасибо!

+0

Для того, чтобы понять, просьба представить табличные данные пример ожидаемым результатам. – AlexM

ответ

1

Если я получу вас правильно, вам нужно получить первый балл и последний балл за песню и рассчитать разницу (дельта), которая будет представлять, как оценка менялась со временем.

Попробуйте это:

SELECT DISTINCT 
    song_id, 
    -- the first score of a song 
    first_value(score) OVER (PARTITION BY song_id ORDER BY date ASC) as first_score, 
    -- the last score of a song 
    first_value(score) OVER (PARTITION BY song_id ORDER BY date DESC) as last_score, 
    -- the difference (delta) between the first and the last scores 
    (first_value(score) OVER (PARTITION BY song_id ORDER BY date DESC) - first_value(score) OVER (PARTITION BY song_id ORDER BY date ASC)) as delta 
FROM stats_by_dates 
WHERE date > now() - INTERVAL '3 day' -- get score for the last 3 days 
ORDER BY delta DESC LIMIT 100 
+0

Это прекрасно, спасибо! – jamesfzhang

Смежные вопросы