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