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