添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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 字段 进行的聚合函数.