[英]Only selecting certain rows based on calculated value
我有一個類似的表:
-----------------------
|Student| Month| GPA |
---------------------
| 1 | 1 | 70 |
| 1 | 2 | 70 |
| 1 | 3 | 75 |
| 2 | 1 | 80 |
| 2 | 2 | 72 |
| 2 | 3 | 72 |
我想要的是計算每個學生每月的 GPA 變化 - 只選擇觀察到實際變化的行。 我想要的 output 是:
-----------------------
|Student| Month| GPA |
---------------------
| 1 | 3 | 1.071|
| 2 | 2 | 0.9 |
到目前為止,我有以下查詢(簡化,但類似):
SELECT
Student,
Month,
GPA,
Change =
CASE
WHEN LAG(GPA, 1) OVER (ORDER BY Student, Month) !> 0
THEN 1
WHEN Student != LAG(Student, 1) OVER (ORDER BY Student, Month)
THEN 1
ELSE GPA/LAG(GPA, 1) OVER (ORDER BY Student, Month)
FROM students
ORDER BY Student, Month;
我收到的 output 是:
---------------------------------
|Student| Month| GPA | Change|
---------------------------------
| 1 | 1 | 70 | 1 |
| 1 | 2 | 70 | 1 |
| 1 | 3 | 75 | 1.071|
| 2 | 1 | 80 | 1 |
| 2 | 2 | 72 | 0.9 |
| 2 | 3 | 72 | 1 |
我相信子查詢只需要 select 行 where Change != 1
,但我不確定如何在這里正確實現。
你似乎想要:
select s.*,
gpa / nullif(prev_gpa, 0) -- I suppose a 0 gpa is possible
from (select s.*,
lag(gpa) over (partition by student order by month) as prev_gpa
from s
) s
where prev_gpa is not null and prev_gpa <> gpa;
與 Gordon 的非常相似,但利用 LAG 的可選第三個參數在沒有前一個的情況下使用當前行的 GPA(不產生任何變化)。
SELECT *
FROM (
SELECT Student, Month, GPA
, Change = GPA / LAG(GPA, 1, GPA) OVER (PARTITION BY Student ORDER BY Month)
FROM students
) AS subQ
WHERE Change != 1.0
ORDER BY Student, Month
;
編輯:我不確定最小 GPA 值可能是多少,但最好知道之前的 GPA 為 0 會導致除以零錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.