比如数据表 kaohe 的字段有 id,department,date,userid,score。
需求有三个: 1、怎么根据 score 在一个语句里分月度、分部门进行组内排序,以及当月全体排序?
2、怎么能多一列来显示自动分布的绩效?排名前 20%的就是绩效 A,后 10%的就是绩效 C
3、怎么把这个排序和新增后的绩效结果全部插入到一个新表里?
我是 MySQL 数据库,木有 row_number ()函数
1
tairan2006 2019-05-26 10:10:10 +08:00 via Android
答案是用 Python
|
2
lihongjie0209 2019-05-26 10:33:15 +08:00 1
不懂 sql 的话直接在代码里实现.
|
3
leriou 2019-05-26 10:36:51 +08:00
case when
|
4
DefoliationM 2019-05-26 10:45:44 +08:00 via Android
很简单 使用游标
|
5
ditie OP @tairan2006 并不会呀。。。
|
6
ditie OP @lihongjie0209 代码里更不会了。。。
|
7
Cat73 2019-05-26 10:58:12 +08:00
MySQL 有 count,有 limit,麻烦点的思路可以先查记录的 id,然后 where id in ( ... )
|
9
ditie OP @DefoliationM 游标。。。我百度了下都没明白。。。
|
11
Huelse 2019-05-26 11:03:08 +08:00
呃,我的理念是,任何多余的 where 条件都不写,全部交给语言去处理
|
13
francis59 2019-05-26 11:40:26 +08:00
太复杂的话要么写程序分析,要么复制到 excel 里用公式分析,excel 有不少统计分析的公式
|
14
Alexhohom 2019-05-26 11:41:09 +08:00
前 20%可以在代码里实现
|
15
thedog 2019-05-26 11:50:38 +08:00
用 rank() over(partition by ....)
您可以搜一下这个东西的用法 |
16
thedog 2019-05-26 11:51:07 +08:00
哦,没有 row_number,那当我没说。。。
|
20
lolizeppelin 2019-05-26 15:57:24 +08:00 1
over 是窗口函数 mysql 8.0 mariadb 10.2 以后支持
|
21
zeraba 2019-05-26 16:01:57 +08:00 via Android
搜索 mysql 添加行号,有了行号有序的列表实现这个需求应该很简单了
|
22
Takamine 2019-05-26 18:28:50 +08:00 via Android
换 postgerSQL。:doge:
|
24
sinchuan 2019-05-26 18:48:41 +08:00 via iPhone
存储过程。尽量语句分开写,方便日后有变更。
|
25
Umenezumi 2019-05-26 19:57:23 +08:00
求总 Count 然后根据需要 when case
|
26
zxcslove 2019-05-26 19:59:25 +08:00 via Android
插句话,假设有并列名次遇到区段边界如何处理?
|
28
ditie OP @lolizeppelin 5.7 版本呀,我倒想换呢,无奈我说了不算
|
33
acehow 2019-05-26 20:27:06 +08:00 via Android
MySQL8 支持 over 开窗函数。
|
35
webdisk 2019-05-26 20:30:33 +08:00
弄完之后发现自己的绩效是 C
|
36
strcmp 2019-05-26 20:37:31 +08:00
redis zset
|
37
zander1024 2019-05-26 20:50:36 +08:00
@ditie mysql 存储不是笑话... 代码明明很好实现你一定要数据库实现那就存储,游标吧
|
38
ditie OP @zander1024 真心求教下,这个“代码”是指什么,怎么个写法呢?我是真的不会呀
|
41
Alexhohom 2019-05-26 21:16:03 +08:00
@ditie #19 比如你根据一些需求排序后,你的 query 里会有 count 属性,然后代码里想要控制多少数目都行。
|
42
Alexhohom 2019-05-26 21:17:39 +08:00
@ditie #40 想要分月度就 group by month 分部门就 group by department 同时 group by month,department
|
43
ditie OP @Alexhohom group by 我会了。现在碰到俩问题:
背景:数据表 kaohe 的字段有 id,department,date,userid,score。数据表 staff 有 userid,username,department 1、我有 100 个员工,当月可能只有 30 条员工的考核记录,那么最后 group by 员工号统计时另外 70 人就没有月度(KH.date)的值,请问该怎么让这 70 个人的结果里也有一致的月度值。语句是这样: select KH.date,ST.userid,St.username,sum(KH.score)+100 as total from staff as ST left join on kaohe as KH on ST.userid=KH.userid group by KH.date,KH.userid 2、count 属性该怎么体现或者加工出来,每个月给前 20%的人赋值为 A,后 10%的人为 C,其他人为 B |
44
Alexhohom 2019-05-26 21:39:05 +08:00
1. sql server 中可以这样(case sum(KH.score)+100 when 100 then -1 else sum(KH.score)+100 end) as total,其中-1 是你自己确定的。
2. count 在代码中执行完 query 会有一个返回吧,就是你需要从数据库中取值的那个变量。count 可以帮助你遍历你的查询 |
45
ditie OP @Alexhohom 完了,这两条我都没看明白 - -@ 。第一个点是用来实现什么效果的呢?第二个 count 我还是不懂是指什么,count(*) 这样的记录数?
|
46
Alexhohom 2019-05-26 22:04:45 +08:00
@ditie #45 1. 就相当于 sql 里面的 if 语句, 如果考核表没有记录,那么 sum(kh.score)+100=100,发现这样的记录使其 total=-1。
2. 第二个就是你执行 query 后,没有报错会返回一个 result (我刚刚查的,没用过 nodejs ),result 中应该有 count 相关属性吧。result.count 这类的。 |
47
ditie OP @Alexhohom 嗯,第一点我知道 sql 这么写执行后的结果,但这个结果和我的需求没关系呀,还是不能分出百分比然后赋值;第二点这个返回的 result 不就是后台执行 sql 的结果么?你的意思是 sql 不动了、在前台用代码来实现分出百分比然后赋值的效果?然而这个前台的代码我也不会。。。
|
48
Alexhohom 2019-05-26 22:17:45 +08:00
@ditie #47 对的,sql 语句排序不行就用后台代码实现,换一种思路。第一个不是解决让其他 70 个人的值一致嘛
|
49
mmdsun 2019-05-26 22:52:57 +08:00 via Android
最终显示效果是怎么样的?这样?
(月 score 部门,月 score 全体,绩效) |
50
xuanbg 2019-05-27 07:19:40 +08:00
分 3 次操作就简单了呀,先不要管什么 ABC,把数据存进去。然后再把排序在前 20%的更新成 A,最后把倒序前 10%更新成 C。
楼上那些无脑查询让代码处理的,就没遇到过数据量太大导致磁盘 IO 和网络 IO 飞起么? |
51
DRcoding 2019-05-27 09:19:08 +08:00
|
52
ratel 2019-05-27 09:32:27 +08:00
可以增加另外的统计表,不建议太复杂的 SQL
|
54
ditie OP @mmdsun 是的,我想要的数据是结果是 月度,部门,员工 ID,score,部门内排名,绩效(根据部门内排名的百分比分布来给 ABC ),全公司排名
|
58
Beeethoven 2019-05-27 09:56:59 +08:00
为什么一定要一个 sql 查出来呢,后台代码实现要简单很多而且性能高很多,一次把需要的数据全部查出来,然后分类输出就好了
|
59
Beeethoven 2019-05-27 10:03:05 +08:00
java 的话就新建一个 examine 实体,department,date,userid,score 四个属性,再加一个 rank 来分类,根据条件查出来然后循环赋值 rank 给前端显示需要的结果。
插入到新表中就用代码 insert 回去就好了 |
61
xuanbg 2019-05-27 11:02:50 +08:00
@ditie 其实是 4 次,1 次 insert,3 次 update,不需要存储过程,当然,你把这 3 个操作写到一个存储过程里面也是可以的。
|
62
tudouxiong 2019-05-27 11:05:51 +08:00 via Android
窗口函数,需要 mysql 8 以后
|
63
LeeSeoung 2019-05-27 14:00:05 +08:00
先查一遍总数 按分数倒序排 ,然后 case when 判断 rownum<total*0.2 则 A ……这样可以不
|
64
ditie OP @Beeethoven 是的,现在打算分步骤了,不打算一步到位。说实话,java 我一点都不会
|