簡體   English   中英

SQL Row_number 條件

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

在此處輸入圖像描述 我正在使用 MSSQL

您還需要根據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.

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