1. 须要按照车辆类型分类,找出省油冠军(百千米油耗最低);blog
普通分组函数能够找出对应的车辆类型及省油冠军,可是没法查询到车辆惟一标识;排序
select MIN(TO_NUMBER(M.OIL100MILE)),B.C_USE_TYPE from iov_screen_data_month M
left join ANALYSIS.IOV_CAR_BASIC_INFO b on M.TERMINAL_ID = b.C_TID
WHERE M.MILEAGE > 10000 AND M.OIL_COST > 3000 AND B.C_USE_TYPE IS NOT NULL
GROUP BY B.C_USE_TYPE;it
group by后添加vin码,会查询出全部车的信息,不符合需求;io
方案一:class
借助 WITH AS 查询语句进行查询;select
WITH TEMP AS (SELECT B.C_VIN_8 VIN8, S.TOTAL_MILEAGE COUNT, B.C_USE_TYPE TP FROM IOV_SCREEN_RECORD_UPDATE S LEFT JOIN
ANALYSIS.IOV_CAR_BASIC_INFO B ON S.TERMINAL_ID = B.C_TID)
SELECT * FROM TEMP WHERE TEMP.COUNT IN (SELECT MAX(TO_NUMBER(TEMP.COUNT)) FROM TEMP
WHERE TEMP.TP IS NOT NULL GROUP BY TEMP.TP);im
注意:若是分组字段中的最小值存在重复,一个分组,in 条件会查询出多条数据;数据
方案二:查询
使用分析函数row_number() over(partition by 分组字段 order by 排序字段)
先把须要的数据查询到第一位,再把分组后的第一条数据取出便可;
SELECT VIN8, TP, COUNT FROM (SELECT M.TOTAL_MILEAGE COUNT, B.C_VIN_8 VIN8,B.C_USE_TYPE TP, ROW_NUMBER() OVER(
PARTITION BY B.C_USE_TYPE ORDER BY TO_NUMBER(M.TOTAL_MILEAGE) DESC NULLS LAST) RN FROM IOV_SCREEN_RECORD_UPDATE M
LEFT JOIN ANALYSIS.IOV_CAR_BASIC_INFO B ON M.TERMINAL_ID = B.C_TID
WHERE B.C_USE_TYPE IS NOT NULL)
WHERE RN =1;
若是返回多条数据,须要用到游标;
综上所述,第二种方案最简单,推荐使用;
背景介绍:函数1. 须要按照车辆类型分类,找出省油冠军(百千米油耗最低);blog普通分组函数能够找出对应的车辆类型及省油冠军,可是没法查询到车辆惟一标识;排序select MIN(TO_NUMBER(M.OIL100MILE)),B.C_USE_TYPE from iov_screen_data_month Mleft join ANALYSIS.IOV_CAR_BASIC_INFO b on ...
有时我们在定义
字段
名及别名时所用名与
oracle
关键字同名,这时该如何处理呢? 其实很简单,只要在此关键字加上””,如”
group
” 看下面的例子: 代码如下: SQL> DROP TABLE k; Table dropped — 建立表K,
字段
名为UID(
oracle
关键字) SQL> CREATE TABLE k(UID INT); CREATE TABLE k(UID INT) ORA-00904: : invalid IDENTIFIER —
字段
名加””表创建成功 SQL> CREATE TABLE k(“UID” INT); Table created –插入一些数据 SQL>
今天有一个需求要使用
group
by,
oracle
的的
group
by的用法是:select后面的
字段
要属于
group
by的
字段
,并且order by后面的
字段
也属于
group
by的
字段
里面。
但是我要select的
字段
多于
group
by的
字段
,怎么办呢?
1.查询
字段
使用的
oracle
的版本
select * from nls_database_parameters;
我的是12.2.0.1.0,也就是12c
2.两种
group
by的方法
(1).
oracle
10版本及其以前,..
需求:想根据某一个
字段
进行
分组
,然
后取
出所有的列数据,在mysql
中
,可以直接通过
group
by 进行相应的操作
获取
数据,
但是在
ORACLE
中
,所
取
的
字段
必须要与
group
by
中
相一致,才能进行读
取
操作,因为
分组
后的其他
字段
,
oracle
并不知道要返回哪一个,但是这种需求又是存在的。怎么办,找到的解决方案:
-- 格式
select *
from (select t.*,
使用first_value函数
select distinct col1,
first_value(col2) over (partition by col1 order by col2 asc)
from tmp
使用over开窗函数
select col1, col2 from (
select col1, col2,
row_number() over (partition by...
最近帮朋友处理一批数据,将指定的列重复的数据拿出来。这些数据在excel里。有10W条左右。由于EXCEL不好操作。就想着将数据导入数据库通过SQL语句来操作。
导入数据库成功了,但由于SQL不是很牛,所以查询有些问题。
我用
group
by 把重复的拿掉,但还有个问题,大家都知道用
group
by的话,select 后面指定的
字段
必须与
group
by后面的一致。
group
by 只有个别字
今天这个帖子主要解决如何用
Oracle
窗口函数解决sql select不能显示除
group
by后面的列的问题,譬如某个学校初一年级一共三个班级,每个班级有不同的学生人数,想要筛选出年纪第一,并且select出该学生所属班级,姓名等
group
by没有聚合到的列名。
老规矩,用sqlfiddle建数据模型。
create table student(grade char(10),classno char(10),student_name varchar2(20),score number);
insert
SELECT column1, column2, aggregate_function(column3)
FROM table_name
GROUP
BY column1, column2;
其
中
column1、column2为需要
分组
的
字段
, aggregate_function(column3)为对column3
字段
进行的聚合函数, 如SUM、COUNT等.
例如:查询每个部门
中
员工的最高工资
SELECT department, MAX(salary)
FROM employees
GROUP
BY department;
其
中
department和salary为需要
分组
的
字段
, MAX(salary)为对salary
字段
进行的聚合函数.