sql'decode'代码解释

时间:2014-06-26 15:42:56

标签: sql oracle sas

我是SAS用户,我有一个我不知道其含义的sql代码。 SQL代码如下。检查'解码'但我拥有的东西对我来说很复杂。不知道其含义。

  select           decode( row_number() over (PARTITION BY spriden_id, rjrsear_posn, rjrsear_suff ORDER BY spriden_id, rjrsear_posn, rjrsear_suff, rjrsewh_pay_end_date desc , w_tmi , c_tmi )
                     , 1 , student_name , NULL ) 
  || chr(9) || decode( row_number() over (PARTITION BY spriden_id, rjrsear_posn, rjrsear_suff ORDER BY spriden_id, rjrsear_posn, rjrsear_suff, rjrsewh_pay_end_date desc , w_tmi , c_tmi )
                     , 1 , spriden_id , NULL )
  || chr(9) || decode( row_number() over (PARTITION BY spriden_id, rjrsear_posn, rjrsear_suff ORDER BY spriden_id, rjrsear_posn, rjrsear_suff, rjrsewh_pay_end_date desc , w_tmi , c_tmi )
                     , 1 , trim(rjrsear_posn)||' ('||trim(rjrsear_suff)||')' , NULL )

您能解释一下这段代码的用途吗?或者有没有办法用SAS语言编写

1 个答案:

答案 0 :(得分:0)

这里的DECODE函数不是很复杂,而是分析函数ROW_NUMBER OVER (PARTITION BY xxx ORDER BY yyy)

spriden_id, rjrsear_posn, rjrsear_suff个所有记录按spriden_id, rjrsear_posn, rjrsear_suff, rjrsewh_pay_end_date desc , w_tmi , c_tmi排序(显然,顺序可以减少到rjrsewh_pay_end_date desc , w_tmi , c_tmi)。如果根据上面的顺序(使用解码和行号1测试),结果记录恰好是每个组的第一个,那么它的值将以制表符分隔的字符串显示,否则为null。

也许这被用作一种群组头衔,而不是显示

Tom, 1, A, X, a, b
Tom, 1, A, X, c, d
Tom, 1, A, X, e, f
Joe, 2, A, Y, g, h
Joe, 2, A, Y, i, j
你显示

Tom 1 A (X), a, b
             c, d
             e, f
Joe 2 A (Y), g, h
             i, j

(前提是您以相同的排序顺序显示记录。)

我认为没有理由在同一个表达式上使用三个解码而不是一个,顺便说一下。