我是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语言编写
答案 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
(前提是您以相同的排序顺序显示记录。)
我认为没有理由在同一个表达式上使用三个解码而不是一个,顺便说一下。