簡體   English   中英

僅根據計算值選擇某些行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM