1. 需要按照车辆类型分类,找出省油冠军(百公里油耗最低);

普通分组函数可以找出对应的车辆类型及省油冠军,但是无法查询到车辆唯一标识;

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;

group by后添加vin码,会查询出所有车的信息,不符合需求;

借助 WITH AS 查询语句进行查询;

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);

注意:如果分组字段中的最小值存在重复,一个分组,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. 需要按照车辆类型分类,找出省油冠军(百公里油耗最低); 普通分组函数可以找出对应的车辆类型及省油冠军,但是无法查询到车辆唯一标识; select MIN(TO_NUMBER(M.OIL100MILE)),B.C_USE_TYPE from iov_screen_data_month M left join ANALYSIS.IOV_CAR_BASI...
昨天有个需求对 数据 库的 数据 进行去重排名,同一用户去成绩最高,时间最短,参与活动最早的一条 数据 进行排序。我们可以利用MySQL group by的特性。 MySQL的 group by与 Oracle 有所不同,查询得 字段 可以不用 聚合函数,查询结果取得是每一组的第一行记录。 利用上面的特点,可以利用mysql实现一种独特的排序; 首先先按某个 字段 进行order by,然后把有顺序的表进行 分组 ,这样每组的成员都是有顺序的,而mysql默认取得 分组 的第一行。从而得到每组的最值。 select id, (@rowno := @rowno + 1) as rank, score, (C.end_ti
使用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...
Oracle 查询某个表的总 字段 数,要用SQL语句,或者在PL/SQL里面 代码如下:select count(column_name) from user_tab_columns where table_name=’T_B_AUDITOR’能够查出来指定的那张表的 字段 数。下面是通过大致查看:select   tname,count(*)   from   col group by   tname; 代码如下:64 T_A_BOOKSTAGEINFO 465 T_B_AUDITOR 1466 T_B_BOOKMANAGEMENT 1367 T_B_BOOKSTATUSCONFIG 56
2.HAVING 是跟 GROUP BY 连在一起用的,放在 GROUP BY 后面,此时的作用相当于WHERE 3.WHERE 后面的条件 不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以  Where和Having都是对查询结果的一种筛选,说的书面点就是设定条件的语句。下面分别说明其用法和异同点。 注:本文使用 字段 oracle 数据 默认用户scott下面的emp表,sal代表员工工资,deptno代表部门编号。 一、聚合函数     说明前我们先了解下聚合函数:聚合函数有时候也叫统计函数,它们的作用通常是对一组 数据 的统
需求:想根据某一个 字段 进行 分组 ,然后取出所有的 数据 ,在mysql ,可以直接通过 group by 进行相应的操作 获取 数据 , 但是在 ORACLE ,所取的 字段 必须要与 group by 相一致,才能进行读取操作,因为 分组 后的其他 字段 oracle 并不知道要返回哪一个,但是这种需求又是存在的。怎么办,折腾一番,找到的解决方案 SQL 语句如下 select * from ( select...
需求:想根据某一个 字段 进行 分组 ,然后取出所有的 数据 ,在mysql ,可以直接通过 group by 进行相应的操作 获取 数据 , 但是在 ORACLE ,所取的 字段 必须要与 group by 相一致,才能进行读取操作,因为 分组 后的其他 字段 oracle 并不知道要返回哪一个,但是这种需求又是存在的。怎么办,找到的解决方案: -- 格式 select * from (select t.*,
今天有一个需求要使用 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版本及其以前,..
以前的认知 ,select的 字段 必须全部 group by里面有2种情况:(基本知识,完全正确) 1、使用 GROUP BY 语句时,SELECT 的项目,必须在 GROUP BY 出现 SELECT a, b, c table1 GROUP BY a, b, c 2、和聚合函数一起使用 (一般都是这么使用) SELECT a, b, sum(c) table1 GROUP BY 遇到的问题:.
在讲解 分组 函数之前,也许有人会问,什么是 分组 函数? 分组 函数作用于一组 数据 ,并对一组 数据 返回一个值。 一、 数据 分组 分组 函数) ——max(最大值),min(最小值),avg(平均值),sum(求和),count(求总数) 问题:如何显示所有员工 最高工资和最低工资? select max(sal),min(sal) from emp; 问题:最高工资那个人是谁? 错误 法:select enam...
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 字段 进行的聚合函数.