PostgreSQL: кумулятивный балл за первое свидание - PullRequest
0 голосов
/ 31 мая 2018

У меня есть пример таблицы:

id  date    score
11  1/1/2017 14:32  25.34
4   1/2/2017 12:14  34.34
25  1/2/2017 18:08  37.15
4   3/2/2017 23:42  47.24
4   4/2/2017 23:42  54.12
25  7/3/2017 22:07  65.21
11  9/3/2017 21:02  74.6
25  10/3/2017 5:15  11.3
4   10/3/2017 7:11  22.45

Моя цель состоит в том, чтобы рассчитать первую (!) Дату (ГГГГ-ММ-ДД), в которую совокупный показатель идентификатора достиг 100 (> =).Для этого я написал следующий код:

SELECT date(date),id, score,
sum(score) over (partition by id order by date(date) rows unbounded preceding) as cumulative_score
FROM test_q1
GROUP BY id, date, score
Order by id, date

Возвращает:

date    id  score   cumulative_score
1/1/2017    11  25.34   25.34
9/3/2017    11  74.6    99.94
1/2/2017    4   34.34   34.34
3/2/2017    4   47.24   81.58
4/2/2017    4   54.12   135.7
10/3/2017   4   22.45   158.15
1/2/2017    25  37.15   37.15
7/3/2017    25  65.21   102.36
10/3/2017   25  11.3    113.66

Я попытался добавить либо WHERE cumulative_score> = 100, либо HAVING совокупный счет> = 100,но он возвращает_

ОШИБКА: столбец "cumulative_score" не существует ЛИНИЯ 4: ГДЕ cumulative_score> = 100 ^ Состояние SQL: 42703 Символ: 206

Кто-нибудь знает, как решить эту проблему?

Спасибо

То, что я ожидаю, это:

date    id  score   cumulative_score
4/2/2017    4   54.12   135.7
7/3/2017    25  65.21   102.36

А на выходе только идентификатор и дата.

1 Ответ

0 голосов
/ 31 мая 2018

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

with cumulative_sum AS (
    SELECT id,date,sum(score) over( partition by id order by date) as sum from test_q1
),
above_100_score_rank AS (
    SELECT *, rank() over (partition by id order by sum) AS rank 
       FROM cumulative_sum where sum > 100 
)
SELECT * FROM above_100_score_rank WHERE rank= 1;
...