mysql group 查询的替代_sql group by 无法显示的字段的替代办法

他不是万能的,很可能就差一步完美收工,却因为语法设计理念,导致功亏于溃.

有这么一个表

有这么一个表,现在想取每个小时南屋北屋两者的最大值, 同时还要保留position

问一个group by 能否解决

cc2e388fcf1a52986976c2171174759d.png

现在 group by 出来了

08bb14f2daea36179590c667205804fa.png

没法加select 后边没法带position,group by 加position 等于又回到了原来.

于是出了这个表也不知道position 是哪个,等于无用了..........

换一种思路,把行转列配合group ,尽管显示的不太符合要求,但在程序中做个判断也基本能满足要求了

selectday, hour,

sum(CASE Position WHEN N'南屋' THEN datavalue ELSE 0 END) AS '南屋',

sum(CASE Position WHEN N'北屋' THEN datavalue ELSE 0 END) AS '北屋',max (datavalue) maxvaluefrom test group by day, hour order by day , hour

59bb37f7ba00d0021ec1a7302897673b.png

在换一种思路

select * from(select *,row_number() over(partition by year,month,day,hour order by datavalue desc) as Sequence from test )T where T.Sequence=1

a36f61719ed28ee9f09db54c9bc38ffc.png

b1150d3fb38642f695c44e35a7d1e836.png

很好的弥补了group by 的不足, row_number() over(partition by..) 可以看做是显示版的groupby 了

因此,二者的区别在于,如果要select出不在group by语句中的列,则应该使用row_number() over(partition by),如果需要select的列全在group by中,则使用group by语句。

当然现实中 也存在一个问题, 南屋北屋两个值相同时,默认排序中谁在前边,就留下谁的值,这样也不能满足实际需求, 但在此满足了题目要求,如果真到现实中,求max 还得在程序里去把值相同的给过滤开来.

扩展: 配合group by 的使用,把group by 分组下的其他字符串的列给合并起来

string_agg,array_agg 这两个函数的功能大同小异,只不过合并数据的类型不同。

create table jinbo.employee(empno smallint, ename varchar(20), job varchar(20), mgr smallint, hiredate date, sal bigint, comm bigint, deptno smallint);

insert into jinbo.employee(empno,ename,job, mgr, hiredate, sal, comm, deptno) values (7499, 'ALLEN', 'SALEMAN', 7698, '2014-11-12', 16000, 300, 30);

insert into jinbo.employee(empno,ename,job, mgr, hiredate, sal, comm, deptno) values (7566, 'JONES', 'MANAGER', 7839, '2015-12-12', 32000, 0, 20);

insert into jinbo.employee(empno,ename,job, mgr, hiredate, sal, comm, deptno) values (7654, 'MARTIN', 'SALEMAN', 7698, '2016-09-12', 12000, 1400, 30);select * fromjinbo.employee;

empno| ename | job | mgr | hiredate | sal | comm |deptno-------+--------+---------+------+------------+-------+------+--------

7499 | ALLEN | SALEMAN | 7698 | 2014-11-12 | 16000 | 300 | 30

7566 | JONES | MANAGER | 7839 | 2015-12-12 | 32000 | 0 | 20

7654 | MARTIN | SALEMAN | 7698 | 2016-09-12 | 12000 | 1400 | 30(3 rows)

1.查询同一个部门下的员工且合并起来

方法1:select deptno, string_agg(ename, ',') fromjinbo.employee group by deptno;

deptno|string_agg--------+--------------

20 |JONES30 |ALLEN,MARTIN

方法2:select deptno, array_to_string(array_agg(ename),',') fromjinbo.employee group by deptno;

deptno|array_to_string--------+-----------------

20 |JONES30 | ALLEN,MARTIN

select deptno, string_agg(ename, ',' order by ename desc) fromjinbo.employee group by deptno;

deptno|string_agg--------+--------------

20 |JONES30 | MARTIN,ALLEN

concat 字符连接

非group by

一、concat()函数

1、功能:将多个字符串连接成一个字符串。

2、语法:concat(str1, str2,...)

返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

3、举例:

例1:select concat (id, name, score) as info from tt2;

group_concat()函数  MySQL 中的 group_concat

1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

3、举例:

7959d9a46b0101bac78715ceab718c34.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值