[英]SQL Row_number conditional
我只需要在我的數據集的單獨列中對 Test_events in ('Math Test', 'Biology Test') 進行 row_number,並按 student_id、session_id 進行分區並按 Test_date asc、Test_order asc 進行排序。
我試圖在下面的“rnum”列代碼中實現它。 但我注意到學生 987 的“數學測試”和“生物測試”的 rnum 不正確,應該是 1 和 2 rnum,但我有 10 和 11。(其他學生都正確)。
如何將我的代碼更改為 row_number 僅在單獨的列中需要的事件?
所需的編號在列 needed_rnum 中。 數據集:
學生卡 | 測試類型 | session_id | 測試日期 | 測試訂單 | 編號 | 需要_rnum |
---|---|---|---|---|---|---|
987 | 第一次測試 | 1個 | 2022-05-01 23:47:46.000 | 0 | NULL | NULL |
987 | 第一次測試 | 1個 | 2022-05-01 23:47:46.000 | 0 | NULL | NULL |
987 | 有用的第一次測試 | 1個 | 2022-05-01 23:47:46.000 | 1個 | NULL | NULL |
987 | 有用的第一次測試 | 1個 | 2022-05-01 23:47:46.000 | 1個 | NULL | NULL |
987 | 第二次測試 | 1個 | 2022-05-01 23:48:42.000 | 4個 | NULL | NULL |
987 | 篩選測試 | NULL | 2022-05-01 23:48:50.000 | NULL | NULL | NULL |
987 | 第二次測試 | 1個 | 2022-05-01 23:55:53.000 | 4個 | NULL | NULL |
987 | 篩選測試 | NULL | 2022-05-01 23:56:01.000 | NULL | NULL | NULL |
987 | 歷史測驗 | 1個 | 2022-05-01 23:56:39.347 | 11 | NULL | NULL |
987 | 英語測驗 | 1個 | 2022-05-01 23:56:39.347 | 22 | NULL | NULL |
987 | 物理測試 | 1個 | 2022-05-01 23:56:39.347 | 32 | NULL | NULL |
987 | 數學測驗 | 1個 | 2022-05-01 23:56:43.080 | 50 | 10 | 1個 |
987 | 生物測試 | 1個 | 2022-05-01 23:56:43.823 | 55 | 11 | 2個 |
543 | 數學測驗 | 1個 | 2021-12-20 10:46:53.940 | 50 | 1個 | 1個 |
543 | 生物測試 | 1個 | 2021-12-20 11:19:54.173 | 55 | 2個 | 2個 |
543 | 標記為 A+ | 1個 | 2021-12-21 13:17:33.100 | 500 | NULL | NULL |
543 | 數學測驗 | 2個 | 2021-12-21 13:36:50.357 | 50 | 1個 | 1個 |
543 | 生物測試 | 2個 | 2021-12-23 10:47:39.267 | 55 | 2個 | 2個 |
543 | 標記為 B+ | 2個 | 2022-01-14 10:41:10.993 | 110 | NULL | NULL |
114 | 數學測驗 | 1個 | 2019-07-14 08:48:54.053 | 50 | 1個 | 1個 |
114 | 生物測試 | NULL | 2019-07-14 08:49:33.807 | 55 | 1個 | 1個 |
114 | 生物測試 | 1個 | 2019-07-14 08:49:34.153 | 55 | 2個 | 2個 |
114 | 標記為 B+ | 1個 | 2019-09-13 01:05:47.467 | 110 | NULL | NULL |
SELECT student_id,
Test_type,
session_id,
Test_date,
Test_order,
,case when Test_type in (
'Math Test', 'Biology Test'
) THEN row_number()over (partition by student_id, session_id order by Test_date asc, Test_order asc)
else NULL end as rnum
FROM tab1 t
您還需要根據Test_type
是否是您的值之一進行分區
SELECT
student_id,
Test_type,
session_id,
Test_date,
Test_order,
case when Test_type in (
'Math Test', 'Biology Test'
) THEN
row_number() over (partition by student_id, session_id, case when Test_type in ('Math Test', 'Biology Test') then 0 else 1 end
order by Test_date, Test_order)
end as rnum
FROM tab1 t
請注意, ELSE NULL
是默認值, ASC
也是
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.