использование оконной функции lag () для вычисления процентного изменения

Я пытаюсь вычислить разницу между каждой строкой, каждая из которых имеет определенный атрибут. Например, у меня есть недельное игровое время в трех играх (RDR2, GTA5, Spyro), и я подсчитал, какой процент каждого дня тратится на каждую игру, и я хочу увидеть, какое процентное изменение происходит изо дня в день.

Поэтому я написал:

percent - LAG(percent, 1) OVER (PARTITION BY game ORDER BY time DESC) AS games_delta

но вместо получения желаемого результата:

 |-------------------------------|
 | TIME    GAME   PERCENT  DELTA |
 |-------------------------------|
 | Dec 10  RDR2   25       15    |
 | Dec 10  GTA5   50       40    |
 | Dec 10  Spyro  25      -55    |
 | Dec 9   RDR2   10      -22    |
 | Dec 9   GTA5   10       10    |
 | Dec 9   Spyro  80       13    |
 | Dec 8   RDR2   33       ...
 | Dec 8   GTA5   0        ...
 | Dec 8   Spyro  67       ...

Я получаю множественность игр и совершенно не прав game-delta !:

 |-------------------------------|
 | TIME    GAME   PERCENT  DELTA |
 | Dec 10  RDR2   25       2     |
 | Dec 10  RDR2   25       4     |
 | Dec 10  RDR2   25      -4     |
 | Dec 10  RDR2   25       4     |
 | Dec 10  GTA5   10       5  ...

Какие-либо предложения? Заранее спасибо!

Изменить:

SELECT  time,
        game,
        percent,
        games_delta

Еще у меня в GROUP BY и ORDER BY есть следующее:

GROUP BY time, game, percent, games_delta
ORDER BY time DESC

Изменить 2:

Вот мой CTE:

cte_table4 (time, games_delta) AS
(
    SELECT time,
            percent - LAG(percent, 1) OVER (PARTITION BY game ORDER BY time DESC) AS games_delta

    FROM cte_table3
)

person davviid    schedule 21.12.2018    source источник
comment
Вы можете опубликовать весь ВЫБОР? Вы уверены, что добавляете только один дополнительный столбец. Это не может произвести множественности.   -  person The Impaler    schedule 21.12.2018
comment
Конечно. Я только что добавил. Спасибо за просмотр!   -  person davviid    schedule 21.12.2018
comment
Ах, вам нужно предварительно вычислить агрегацию (GROUP BY) в CTE (Common Table Expression). Затем вы можете использовать LAG() в качестве второго шага. Опубликуйте все избранные, если сможете, и я могу помочь. Использование LAG() перед группировкой приведет к этим странным вычислениям.   -  person The Impaler    schedule 21.12.2018
comment
Извините, я должен был указать, что оператор SELECT в моем первом редактировании находился в основной части моего запроса. В моем CTE мне нечего GROUP BY или, как мне кажется, это действительно нужно?   -  person davviid    schedule 21.12.2018
comment
@TheImpaler Я также считаю, что предварительно вычислил агрегирование GROUP BY в предыдущем CTE cte_table3, прежде чем попытаться использовать LAG()   -  person davviid    schedule 21.12.2018
comment
@TheImpaler Я решил вычислить агрегирование в том же CTE cte_table4, что и LAG(), и это сработало! Спасибо за предложение переместить GROUP BY в CTE!   -  person davviid    schedule 21.12.2018
comment
Это потрясающе.   -  person The Impaler    schedule 21.12.2018


Ответы (1)


Добавление агрегирования GROUP BY в тот же CTE, что и LAG(), устранит проблему.

person davviid    schedule 21.12.2018