Oracle之OVER(PARTITION BY... ORDER BY...)函數的使用

OVER(PARTITION BY... ORDER BY...)的使用說明和意義
這個函數長這個樣子:OVER(PARTITION BY... ORDER BY...)

顧名思義,PARTITION 中文是分割的意思,ORDER 是排序的意思,所以翻譯一下就是先把一組數據按照制定的字段進行分割成各種組,然後組內按照某個字段排序。

oracle之漢字拼音轉碼包

create or replace package GetHZPY is

  -- Author  : ADMINISTRATOR
  -- Created : 2006-10-8 上午 11:51:16
  -- Purpose : 獲得漢字拼音編碼

  -- Public type declarations
  TYPE THZPY_LIST is VARRAY (526) OF  VARCHAR2(6);
  TYPE TROMA_NUM_LIST is VARRAY (94) OF  VARCHAR2(2);
  TYPE TGREECE_ALPHABET_LIST is VARRAY (24) OF  VARCHAR2(2);
  TYPE TPYIndex_191_list IS VARRAY(191) OF NUMBER;
  TYPE TPYIndex_list IS VARRAY(10) OF TPYIndex_191_list;

  -- Public constant declarations
  --<ConstantName> constant <Datatype> := <Value>;

  -- Public variable declarations
  --<VariableName> <Datatype>;

  -- Public function and procedure declarations
  function GetHzPY_by_index(p_PY_Index number) RETURN VARCHAR2;
  FUNCTION get_greece_alphabet_py(p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_roma_num_py(p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_01(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_02(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_03(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_04(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_05(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_06(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_07(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_08(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_09(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_10(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_11(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_12(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION get_py_index_13(p_Index1 NUMBER, p_Index NUMBER) RETURN NUMBER;
  FUNCTION GetHzFullPY(p_String varchar2) RETURN VARCHAR2;
  FUNCTION GetHzFullPYLower(p_String varchar2) RETURN VARCHAR2;
  FUNCTION GetHzFullPYUpper(p_String varchar2) RETURN VARCHAR2;
  FUNCTION GetHzFullPYsubstr(p_String varchar2,s float, e float) RETURN VARCHAR2;
  FUNCTION GetHzPYCAP(p_String varchar2) RETURN VARCHAR2;
  FUNCTION GetHzPYCAPLower(p_String varchar2) RETURN VARCHAR2;
  FUNCTION GetHzPYCAPsubstr(p_String varchar2,s float, e float) RETURN VARCHAR2;
  FUNCTION F_TRANS_PINYIN_CAPITAL(P_NAME IN VARCHAR2) RETURN VARCHAR2;
end GetHZPY;

首先,我要使得相同名稱區分開來,在相同一列下名稱+1  

select F_ID,GETHZPY.GETHZFULLPY(F_realname) as 拼音, f_realname  from t_sys_user

之後第一步

-----1.只保留大於1的
select b.f_id,
case 
  when pinyin=1 then  null
  else pinyin
    end
 from (

select F_ID,
 row_number() OVER(PARTITION BY f_realname ORDER BY f_id) as pinyin, 
 f_realname from t_sys_user) b 

第二步

---- 2.拼音,拼接

select F_ID,
 concat(  GETHZPY.GETHZFULLPY(F_realname) ,row_number() OVER(PARTITION BY f_realname ORDER BY f_id)) pinyin,
  f_realname  from t_sys_user 

第三步  合攏

----3. 合併前兩部



select a.F_ID,
 concat(  GETHZPY.GETHZFULLPY(a.F_realname) ,(select 
case 
  when pinyin=1 then  null
  else pinyin
    end 
 from (

select F_ID,
 row_number() OVER(PARTITION BY f_realname ORDER BY f_id) as pinyin, 
 f_realname from t_sys_user) b where b.f_id=a.f_id)) pinyin2,
  f_realname  from t_sys_user  a

看到上圖,想來大家已經知道,去掉1了,只保留2以上的數字拼接

-----4.修改語句
update t_sys_user t set f_code=  concat(  GETHZPY.GETHZFULLPY(t.F_realname) ,(select 
case 
  when pinyin=1 then  null
  else pinyin
    end 
 from (

select F_ID,
 row_number() OVER(PARTITION BY f_realname ORDER BY f_id) as pinyin, 
 f_realname from t_sys_user) b where b.f_id=t.f_id))

-----5. 查看最終結果
select * from t_sys_user

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章