① sql取出每个分组的前几条
一个简单的方法就是排序之后给它分配序号,根据序号去找前几条
select*
from(select公司,人数,
--按人数从多到少分配序号,不同公司会重1开始
rank()over(partitionby公司orderby人数desc)asxh
from公司档案)asA
wherexh<=2--取前几位就写几
orderby公司,人数desc
排序效果如下
② sql 取分组 最小值
select USERTYPE from CONFIG_USER group by USERTYPE ORDER BY USERTYPE DESC
先分组再排序 取第一个就行了
③ SQL分组查询取第一条数据
我们在查询数据时,经常会使用distinct去重,但使用distinct只能去除所有查询列都相同的记录,如果所查询列中有一个字段值不同,distinct是无法去重的。但我们还想要实现这样的效果,这时我们可以用partition by。
1.例如,我们新建一张学生成绩表。
2.插入一些测试数据。
3.例如我们需要查询每个科目不同的分数,这时候可以用到distinct:
4.但是我们把需求再加一点,需要查询每个科目排名第一的学生信息,这时候就需要用到partition by:
PS:MySQL5.6不支持partition by
此时我们发现,并且第一的小明同学的英语成绩没有被查询出来,接着优化:
④ 请教一个sql(按2个字段分组然后从每组取出最大的一条纪录,再根据一个标记为判断是否取出该值)
CREATETABLE#test(
idINT,
[number]varchar(6),
deptvarchar(6),
[date]int,
flagint
);
GO
INSERTINTO#test
SELECT1,'001','aa',20130201,1UNIONALL
SELECT2,'001','aa',20120801,0UNIONALL
SELECT3,'001','bb',20130403,1UNIONALL
SELECT4,'001','bb',20120404,0UNIONALL
SELECT5,'001','cc',20120604,0UNIONALL
SELECT6,'002','aa',20130201,1UNIONALL
SELECT7,'002','aa',20120801,0UNIONALL
SELECT8,'002','bb',20130403,1UNIONALL
SELECT9,'002','bb',20120404,0UNIONALL
SELECT10,'002','cc',20120604,1
GOSELECT
main.*
FROM
#testmain
WHERE
NOTEXISTS(
SELECT1
FROM#testsub
WHEREmain.[number]=sub.[number]ANDmain.[dept]=sub.[dept]ANDmain.[id]>sub.[id]
);
GO
idnumberdeptdateflag
---------------------------------------------
1001aa201302011
3001bb201304031
5001cc201206040
6002aa201302011
8002bb201304031
10002cc201206041
(6行受影响)
WithMyCTEAS(
SELECT
main.*
FROM
#testmain
WHERE
NOTEXISTS(
SELECT1
FROM#testsub
WHEREmain.[number]=sub.[number]ANDmain.[dept]=sub.[dept]ANDmain.[id]>sub.[id]
)
)
SELECT
[number],MAX([date])ASdate
FROM
MyCTE
GROUPBY
[number]
HAVING
SUM(CASEWHENflag=1THEN1ELSE0END)=COUNT(flag);
GO
numberdate
-----------------
00220130403
(1行受影响)
⑤ sql语句 如何分组后得到记录总数
SELECT COUNT(*)
FROM (SELECT 分组字段 FROM 表
GROUP BY 分组字段
)别名
或者
SELECT COUNT(*)
FROM (SELECT distinct 分组字段 FROM 表)别名
(5)sql分组取出扩展阅读:
SQL分组查询
在SQL Server中使用的分组查询是ORDER BY子句,使用ORDER BY子句要同聚合函数配合使用才能完成分组查询,在SELECT查询的字段中如果字段没有使用聚合函数就必须出现在ORDER BY子句中(即SELECT后边的字段名要么出现在聚合函数中,要么在ORDER BY子句中使用)
在分组查询中还可以配合使用HAVING子句,定义查询条件。
使用group by进行分组查询
在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:
1、被分组的列
2、为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数
3、group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
⑥ SQL查询取分组最大值
selectt1.分类,t1.商品名称,table.库存,t1.更新时间
from (
select 分类,商品名称,max(更新时间) 更新时间 from table
group by 分类,商品名称
) t1
inner join table on t1.分类=table.分类 and t1.商品名称=table.商品名称 and t1.更新时间
=table.更新时间
(6)sql分组取出扩展阅读:
关于SQL最大值查询语句的记录
SELECT
bsnum,
STATE AS FILE_STATE
FROM
FILE_RECORD r
WHERE
STATE =(
SELECT
MAX(STATE)
FROM
FILE_RECORD
WHERE
bsnum = r.bsnum
);
小技巧:有时需要测试sql语法但又觉得创建表麻烦,可以使用创建一个临时表,如下:
select id, count(t.id) from
(
select 1 as id, 2 as age, 'F' as sex from al union
select 2 as id, 2 as age, 'M' as sex from al union
select 3 as id, 3 as age, 'F' as sex from al union
select 4 as id, 4 as age, 'M' as sex from al
)t