文章目录
- 1、获取指定日期所在年份
- 2、获取指定日期所在月份
- 3、获取指定日期去年同期日期
- 4、获取指定日期所在年份的总天数
- 5、获取年初到指定日期的天数
- 6、除法运算
- 7、递归查询
- 8、REPLACE函数
- 9、DECODE 函数
- 10、聚合函数
- 11、窗口函数
- 11.1 ROW_NUMBER函数
- 11.2 RANK函数
- 11.3 LEAD 和 LAG函数
- 11.4 SUM函数
- 11.4.1 统计年度累计金额
- 11.4.2 统计去年同期累计金额
- 11.5 数据透视(pivot)操作
- 12、常用sql
- 13、ORACLE表闪回
- 14、DBLink
- 14.1 创建 Database Link
- 14.2 查询远程数据库
- 14.3 执行 DML 操作
- 14.4 删除 Database Link
- 14.5 授权 Database Link
- 14.6 确认授权
1、获取指定日期所在年份
SELECTEXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')) AS year
FROMdual;
2、获取指定日期所在月份
SELECTEXTRACT(MONTH FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')) AS month
FROMdual;
3、获取指定日期去年同期日期
SELECTADD_MONTHS(TRUNC(TO_DATE('2023-11-02', 'yyyy-MM-dd')), -12) AS last_date
FROMdual;
4、获取指定日期所在年份的总天数
1、使用 EXTRACT 函数从日期字符串 ‘2023-11-15’ 中提取年份;
2、TO_DATE(‘2023-11-02’, ‘YYYY-MM-DD’) 将日期字符串转换为日期格式;
3、TO_CHAR(…, ‘YYYY’) 将日期转换为字符串;
4、 TO_NUMBER 将字符串转换为数字;
5、MOD 函数用于计算年份除以 4 的余数,如果余数为 0,则该年为闰年,返回 366 天;否则返回 365 天。
SELECTCASEWHEN (MOD(EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')),4) = 0AND MOD(EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')),100) != 0)OR MOD(EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')),400) = 0THEN 366ELSE 365END AS days
FROMdual;
5、获取年初到指定日期的天数
TRUNC(your_date, ‘YYYY’)用于将日期截断为年初。然后,通过从日期列中减去年初的日期来计算到年初的天数。天数需要加1。
SELECTTO_DATE('2023-01-02', 'yyyy-MM-dd') - trunc( TO_DATE('2023-01-02', 'yyyy-MM-dd'), 'yyyy') + 1 AS days
FROMdual;
6、除法运算
CASEWHEN amt = 0 THEN NULL-- 或者其他处理方式,比如返回 NULLELSE ROUND(pay_amt / amt, 4)* 100
END AS ratio
对于除法运算,要判断除数是否为0
,当除数为 NULL时
,计算结果通常也是 NULL
。
7、递归查询
用于层次结构的数据,比如组织架构、地区划分等。
SELECT*
FROMrelationship a
START WITHa.parent_code = '0'
CONNECT BYPRIOR a.code = a.parent_code;
- 起始条件是 parent_code=‘0’,然后通过
connect by prior
条件递归地沿着自连接关系遍历子集; START WITH
子句指定了起始条件,这里是从parent_code='0'
的记录开始;CONNECT BY PRIOR
子句用于指定递归条件,a.code = a.parent_code
表示每次迭代都会沿着 code 和 parent_code 相等的路径向下查找;
8、REPLACE函数
REPLACE 函数会将原始日期中的年份部分替换为另一个字段的年份部分。确保替换后的格式与原始日期相匹配。
--original_date 是原始日期字段。
--another_date 是作为替换参考的日期字段。
--desired_date 是想要替换成的日期字段。SELECTREPLACE(TO_CHAR(original_date, 'YYYY-MM-DD'), TO_CHAR(another_date, 'YYYY'), TO_CHAR(desired_date, 'YYYY')) AS replaced_date
FROM your_table;
9、DECODE 函数
DECODE 函数是 Oracle 提供的一种条件表达式函数,用于根据指定条件返回不同的结果。
DECODE(expression, search1, result1, search2, result2, ..., default_result)decode(i2.incom_year_amt,0,null,ROUND((i1.incom_year_amt-i2.incom_year_amt)/ i2.incom_year_amt, 4)* 100) AS incratio
- expression 是需要进行比较的表达式或列;
- search1, search2, … 是希望与表达式比较的值;
- result1, result2, … 是如果表达式等于相应搜索值时返回的结果;
- default_result 是当表达式与所有搜索值均不匹配时的默认返回值(可选的);
- DECODE 函数按照给定的搜索值逐个匹配表达式,如果找到匹配的搜索值,则返回相应的结果。如果没有找到匹配的搜索值,且提供了默认结果,则返回默认结果。
10、聚合函数
- 常见的聚合函数包括 SUM、AVG、COUNT、MAX、MIN 等;
- 用于将多行数据聚合为单个结果,例如计算总和、平均值、计数等;
- 经常用于与 GROUP BY 子句一起使用,以便按组执行聚合操作;
SELECTsum(amt) AS all_amt
FROM your_table group by mof_div_code,report_date;
11、窗口函数
- 常见的窗口函数包括 ROW_NUMBER、RANK、LEAD、LAG、SUM 等;
- 用于对数据集中的特定窗口(也称为分区)执行计算;
- 可以在查询结果中添加一列或几列,而不会像聚合函数那样汇总数据。窗口函数通常与 OVER 子句一起使用,该子句定义了要应用窗口函数的数据窗口;
语法:
<窗口函数>(列) OVER (PARTITION BY 分区字段ORDER BY 排序字段ROWS/RANGE 子句
)
11.1 ROW_NUMBER函数
为结果集中的每一行分配一个唯一的数字,通常用于排序后按顺序编号。
SELECT column1,column2,ROW_NUMBER() OVER (ORDER BY column1) AS row_num
FROM your_table;
11.2 RANK函数
为结果集中的每一行分配一个排名,如果有相同值,则排名相同,下一个排名按照次序递增。
SELECT RANK() OVER (ORDER BY column_name) AS rank_value,column_name
FROM table_name;
11.3 LEAD 和 LAG函数
LEAD() 和 LAG():分别用于获取当前行后面和前面的行的值。
SELECT RANK() OVER (ORDER BY column_name) AS rank_value,column_name
FROM table_name;
11.4 SUM函数
用于计算指定列的总和,结合窗口函数使用时可计算分组内的累计总和。比如需要统计某一年到指定日期的汇总金额。
SELECT column_name,SUM(column_name) OVER (PARTITION BY group_column ORDER BY order_column) AS running_total
FROM table_name;
11.4.1 统计年度累计金额
SUM(INCOM_DAY_AMT) OVER (PARTITION BY FISCAL_YEAR ORDER BY MOF_DIV_CODE,FUND_TYPE_CODE,REPORT_DATE) AS cur_day_total
- SUM(INCOM_DAY_AMT): 这部分是求和的基本函数;
- OVER: 表示开始窗口函数的定义;
- ARTITION BY EXTRACT(YEAR FROM REPORT_DATE): 这个部分是将数据按照年份进行分区,意味着对每一年的数据进行分组;
- ORDER BY MOF_DIV_CODE, FUND_TYPE_CODE, REPORT_DATE: 这里指定了窗口函数的排序顺序,首先按照 MOF_DIV_CODE、FUND_TYPE_CODE、REPORT_DATE 进行排序;
综合起来,这个查询会对每年的数据进行分组
,并按照给定的顺序计算每个分组内的累计金额
,结果将返回每一行数据所在年度的累计金额
。
11.4.2 统计去年同期累计金额
SUM(INCOM_DAY_AMT) OVER (PARTITION BY EXTRACT(YEAR FROM ADD_MONTHS(TRUNC(REPORT_DATE), -12)) ORDER BY MOF_DIV_CODE,FUND_TYPE_CODE,ADD_MONTHS(TRUNC(REPORT_DATE), -12)) AS pre_year_to_date_total
11.5 数据透视(pivot)操作
PIVOT 是 SQL 中的一种操作,它用于将行数据转换为列数据,可以进行数据透视(pivot)操作。PIVOT 操作常用于聚合和重新排列数据,将行转换为列以更直观地展示汇总信息。
SELECT *
FROM (-- 原始查询,生成需要透视的数据-- 包含需要进行透视操作的字段
)
PIVOT (-- 聚合函数和要透视的字段AGGREGATE_FUNCTION(column_name)FOR pivot_column IN (value1 AS alias1, value2 AS alias2, ..., valueN AS aliasN)
)
- AGGREGATE_FUNCTION:聚合函数,例如 SUM()、COUNT()、AVG() 等;
- column_name:要透视的列;
- pivot_column:用于透视的列,即希望将其值作为新列的列;
- value1, value2, …, valueN:pivot_column 列中可能包含的值;
- alias1, alias2, …, aliasN:可选,为透视后的列指定别名;
举例:
SELECT *
FROM (SELECT department, employee_name, salaryFROM employee_salary
)
PIVOT (SUM(salary)FOR department IN ('HR' AS hr_salary, 'IT' AS it_salary, 'Finance' AS finance_salary)
)
将 employee_salary 表按照部门进行透视
,生成新的列 ‘HR’ AS hr_salary, ‘IT’ AS it_salary, ‘Finance’ AS finance_salary,每列包含相应部门的薪资总和
。
12、常用sql
- 金额字段增减随机数
UPDATE tablename
SET CL_CUR_AMT = CL_CUR_AMT - FLOOR(DBMS_RANDOM.VALUE(100000000, 500000000)) where REPORT_DATE = TO_DATE('2022-12-03','yyyy-MM-dd') ;
- 替换字段指定位置值
SUBSTR 函数结合 CONCAT 或 || 运算符来替换一个字段的前两位。
--CONCAT
UPDATE FM_LEDGER_AGENCY set MOF_DIV_CODE = CONCAT('21', SUBSTR(MOF_DIV_CODE , 3)) ;-- || 运算符
SELECT 'new' || SUBSTR(old_field, 3) AS replaced_field
FROM your_table;
- LISTAGG函数
LISTAGG 函数用于将多行数据聚合成一个以指定分隔符分隔的字符串。它通常与 GROUP BY 子句一起使用,用于对分组内的数据进行字符串连接。
SELECT LISTAGG(sub_mof_div_code, ',') WITHIN GROUP (ORDER BY sub_mof_div_code) AS name_list
from GAP_MOF_DIV_RELATION group by mof_div_code
这个查询的结果将返回一个名为 name_list 的列
,其中包含了按照每个 mof_div_code 分组的所有 sub_mof_div_code 值
,以逗号分隔,并按照 sub_mof_div_code 进行排序后的字符串。
13、ORACLE表闪回
- 闪回前进行查询
select * from (select * from GAP_MENU as of timestamp to_timestamp('2023-08-17 19:50:00','YYYY-MM-DD HH24:MI:SS'))where NAME in ('三保预警管理','三保运行监测','三保风险管控','三保配置管理');
- 被闪回的表必须启用行移动功能
alter table GAP_MENU enable row movement;
- 指定时间闪回
flashback table GAP_MENU to scn timestamp_to_scn (to_date('2023-08-17 19:50:00','yyyy-mm-dd hh24:mi:ss'));
- 关闭移动功能
alter table GAP_MENU enable row movement;
14、DBLink
DBLink 提供了一种方式来执行跨数据库的查询和操作。
14.1 创建 Database Link
--remote_db 链接指定的名称
--remote_user、remote_password是远程数据库的用户名和密码
--remote_db_host 主机
--remote_db_service 服务名
create public database link remote_db
connect to remote_user identified by remote_password
using
'(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =remote_db_host)(PORT = 1521))
(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = remote_db_service)))';
14.2 查询远程数据库
SELECT * FROM table_name@remote_db;
14.3 执行 DML 操作
INSERT INTO remote_table@remote_db (column1, column2) VALUES (value1, value2);
14.4 删除 Database Link
DROP DATABASE LINK remote_db;
14.5 授权 Database Link
GRANT CREATE DATABASE LINK TO your_user;
14.6 确认授权
SELECT * FROM DBA_SYS_PRIVS WHERE PRIVILEGE = 'CREATE DATABASE LINK' AND GRANTEE = 'your_user';