【问题标题】:Create Column in sql based on condition?根据条件在sql中创建列?
【发布时间】:2020-07-29 13:08:11
【问题描述】:

表:

  Student_Id    Roll_No    Date   _Rank
1    101         10101    201905    3
2    101         10101    201910    6
3    101         10101    201912    9
4    101         10102    201905    15
5    101         10102    201910    9
6    101         10102    201912    3
7    103         10103    201905    3
8    103         10103    201910    9
9    103         10103    201912    9
10   103         10104    201905    3
11   103         10104    201910    9
12   103         10104    201912    9

我需要根据条件创建一个结果列。

  1. 检查特定的 Student_Id,Roll_No 如果 rank 是 9 并且 rank> 9 没有 根据日期出现在 9 之前,然后出现 1,否则为 0。

  2. 如果某个 Student_Id,Roll_No 有多个 9,则仅标记第一次出现。

结果:

  Student_Id    Roll_No    Date   _Rank   Result
1    101         10101    201905    3       0
2    101         10101    201910    6       0
3    101         10101    201912    9       1 
4    101         10102    201905    15      0 ---
5    101         10102    201910    9       0 --- 15 > 9, came before 9 for that Roll_No
6    101         10102    201912    3       0
7    103         10105    201905    9       1
8    103         10103    201910    9       1
9    103         10103    201912    9       0
10   103         10104    201905    3       0
11   103         10104    201910    9       1 --- first occurrence should 1
12   103         10104    201912    9       0

查询:

SELECT Student_Id, Roll_Number, Date, _Rank,
ROW_NUMBER() OVER( PARTITION BY Roll_Number ORDER BY Date) as rw_number
FROM table t
-- this is giving the row_number which is appeared first.

【问题讨论】:

    标签: sql oracle date select window-functions


    【解决方案1】:

    你可以使用窗口函数:

    select 
        t.*, 
        case 
            when _rank = 9 and row_number() over(partition by roll_no, _rank order by date) = 1
            then 1
            else 0
        end result
    from mytable t
    

    【讨论】:

      【解决方案2】:

      我想你想要:

      select t.*, 
             (case when _rank = 9 and 
                        row_number() over (partition by roll_no, _rank order by date) = 1 and
                        max(_rank) over (partition by roll_no order by date) <= 9
                   then 1 else 0
              end) as result
      from t
      order by roll_no, date;
      

      max(_rank) 条件检查在给定行之前没有出现高于 9 的排名。

      Here 是一个 dbfiddle。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2020-10-02
      • 1970-01-01
      相关资源
      最近更新 更多