Oracle over函数的简单使用

OVER() 在使用时一般会配合其他函数一起使用
1.row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号
2.rank() OVER (PARTITION BY COL1 ORDER BY COL2)
跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
3.dense_rank() OVER (PARTITION BY COL1 ORDER BY COL2)
连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的
4.lag(arg1,arg2,arg3)
arg1是从其他行返回的表达式;arg2是希望检索的当前行分区的偏移量;arg3是在arg2表示的数目超出了分组的范围时返回的值.
5.FIRST_VALUE(arg) OVER (PARTITION BY COL1 ORDER BY COL2)
返回组中数据窗口的第一个值,可以不进行order by
6.LAST_VALUE(arg) OVER (PARTITION BY COL1 ORDER BY COL2)
返回组中数据窗口的最后一个值,可以不进行order by

现在拿row_number举例: read more

Oracle在不连表的情况下进行集合操作

--前提是两个查询的列的数量和数据类型必须完全相同

--最常用的,拼接结果集(取并集)
--去重拼接
SELECT ID FROM TABLE_A
UNION
SELECT ID FROM TABLE_B;

--不去重拼接
SELECT ID FROM TABLE_A
UNION ALL
SELECT ID FROM TABLE_B;

--取交集
SELECT ID FROM TABLE_A
INTERSECT
SELECT ID FROM TABLE_B;

--去差集
--先查第一条SQL结果集,看是否在第二条中,如果在则移除;
--再查第二条,如果在第一没有出现过,则移除
SELECT ID FROM TABLE_A
MINUS
SELECT ID FROM TABLE_B;

Oracle中的trunc函数

trunc()在操作日期时,相当于把时间格式化为零时零分零秒
select sysdate,trunc(sysdate) from dual;
通过执行以上脚本可以发现,被trunc处理过的只有日期,没有时间
trunc传参的用法:
select trunc(sysdate-1) from dual t;–昨天
select trunc(sysdate+1) from dual t;–明天

select trunc(sysdate, ‘yy’) from dual;–当年第一天
select trunc(sysdate, ‘year’) from dual;–当年第一天
select trunc(sysdate, ‘yyyy’) from dual;–当年第一天 read more