ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 18806|回复: 15

如何用sql实现这个高难度的排序需求

[复制链接]
论坛徽章:
32
优秀写手
日期:2014-07-23 06:00:13秀才
日期:2016-08-05 10:34:04秀才
日期:2016-08-05 10:34:04秀才
日期:2016-08-05 10:28:31秀才
日期:2016-08-05 10:33:40技术图书徽章
日期:2016-08-05 10:29:11秀才
日期:2016-08-05 10:28:57秀才
日期:2016-08-05 10:28:57秀才
日期:2016-08-05 10:28:57秀才
日期:2016-09-27 15:16:21
发表于 2017-2-9 16:47 | 显示全部楼层 |阅读模式
本帖最后由 flzhang 于 2017-2-9 19:49 编辑

需求是这样的,先根据加班小时数排序,得出排序位置 。如下例子
部门当月平均加班小时排序
部门编号1
10
1
部门编号2
11
2
部门编号3
12
3
部门编号4
15.1
4
部门编号5
16.1
5
部门编号6
17.2
6

然后要加入TEAM的加班小时数,(TEAM和部门关系是多个部门属于一个TEAM),
加入新TEAM后要根据部门顺序重新定义TEAM的顺序,如下例子
部门当月平均加班小时排序
部门编号1
10
1
部门编号2
11
2
部门编号3
12
3
  TEAM1
  
12.5
4
TEAM2  
13
4
部门编号4
15.1
4
部门编号5
16.1
5
TEAM3  
16.5
6
部门编号6
17.2
6
特别是TEAM1和TEAM2 比部门3的加班小时数大,且小于部门4的加班小时数,但连续排列在
部门3后面,因此序号是一致的都是4.
如果TEAM3加入正好在部门5和6之间,所以TEAM3的序号和部门6的序号相同。
还请各位大侠帮助如何用SQL实现这个排序功能
谢谢各位了









论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2017-2-9 17:03 | 显示全部楼层
数据没有贴全, 贴出测数据样例脚本, 把最终结果贴出来

使用道具 举报

回复
论坛徽章:
3
摩羯座
日期:2016-05-03 14:05:54秀才
日期:2016-06-24 09:15:44秀才
日期:2016-08-05 10:33:40
发表于 2017-2-9 17:59 | 显示全部楼层
先根据TEAM和部门 分开求ROW_NUMBER()OVER(PARTITION BY SUBSTR(部门,1,4) ORDER BY 加班时长) AS RN
然后外层把TEAM的RN置空
再外层使用FIRST_VALUE(RN IGNORE NULLS)OVER(ORDER BY 加班时长 ROWS BETWEEN CURRENT ROW AND UNBONDED FOLLOWING )

使用道具 举报

回复
论坛徽章:
32
优秀写手
日期:2014-07-23 06:00:13秀才
日期:2016-08-05 10:34:04秀才
日期:2016-08-05 10:34:04秀才
日期:2016-08-05 10:28:31秀才
日期:2016-08-05 10:33:40技术图书徽章
日期:2016-08-05 10:29:11秀才
日期:2016-08-05 10:28:57秀才
日期:2016-08-05 10:28:57秀才
日期:2016-08-05 10:28:57秀才
日期:2016-09-27 15:16:21
 楼主| 发表于 2017-2-9 22:46 | 显示全部楼层
bell6248 发表于 2017-2-9 17:03
数据没有贴全, 贴出测数据样例脚本, 把最终结果贴出来

重新整理了,可以看了

使用道具 举报

回复
论坛徽章:
459
探花
日期:2015-08-18 09:50:16秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01
发表于 2017-2-9 23:04 | 显示全部楼层
flzhang 发表于 2017-2-9 22:46
重新整理了,可以看了

这是不够的,要给出CREATE TABLE, INSERT脚本,以及预期结果。

使用道具 举报

回复
认证徽章
论坛徽章:
203
2010新春纪念徽章
日期:2010-03-01 11:20:51至尊黑钻
日期:2015-08-13 13:38:12至尊黑钻
日期:2015-02-15 09:47:472015中国数据库技术大会纪念徽章
日期:2015-05-15 14:08:23管理团队2007贡献徽章
日期:2015-01-19 09:48:272015年中国系统架构师大会纪念徽章
日期:2015-07-31 17:48:20红宝石
日期:2015-01-19 09:42:28红宝石
日期:2017-04-21 09:23:38海蓝宝石
日期:2015-02-03 10:23:39红宝石
日期:2015-02-03 10:26:04
发表于 2017-2-10 08:24 | 显示全部楼层
把你的预期结果 和 表结构 和 测试数据给一下,用excel 画一下也可以的。

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
认证徽章
论坛徽章:
6329
ITPUB9周年纪念徽章
日期:2014-05-02 10:36:402011新春纪念徽章
日期:2014-12-29 12:11:142010广州亚运会纪念徽章:卡巴迪
日期:2014-08-06 08:44:25马上加薪
日期:2017-01-10 16:49:34马上有钱
日期:2017-01-10 16:49:34马上有钱
日期:2014-12-26 15:39:08马上有钱
日期:2014-12-26 15:39:08马上有房
日期:2014-12-26 15:42:55马上有车
日期:2017-01-10 16:49:34马上有钱
日期:2014-12-31 17:16:56
发表于 2017-2-10 08:28 | 显示全部楼层
见三楼的答案!

使用道具 举报

回复
认证徽章
论坛徽章:
40
2014年世界杯参赛球队: 瑞士
日期:2014-07-11 13:13:56慢羊羊
日期:2015-05-05 22:00:25喜羊羊
日期:2015-05-18 16:24:25ITPUB季度 技术新星
日期:2016-07-07 09:28:30慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55摩羯座
日期:2015-10-29 21:07:02狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47
发表于 2017-2-10 10:27 | 显示全部楼层
create table t1 as
select '部门编号1' name,10 value from dual union all
select '部门编号2',11 from dual union all
select '部门编号3',12 from dual union all
select '部门编号4',15.1 from dual union all
select '部门编号5',16.1 from dual union all
select '部门编号6',17.2 from dual union all
select 'TEAM1',12.5  from dual union all
select 'TEAM2',13    from dual union all
select 'TEAM3',16.5 from dual ;

select tmp.name,tmp.value,dense_rank() over (order by value1) rk
from (
select t1.*,
       first_value(case when name like 'TEAM%' then null else value end ignore nulls)
              over(order by value rows between current row and unbounded following) value1
  from t1) tmp;

NAME               VALUE         RK
------------- ---------- ----------
部门编号1              10          1
部门编号2              11          2
部门编号3              12          3
TEAM1               12.5          4
TEAM2                 13          4
部门编号4            15.1          4
部门编号5            16.1          5
TEAM3               16.5          6
部门编号6            17.2          6
9 rows selected

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2017-2-10 10:43 来自手机 | 显示全部楼层
需求很不明确 要详细说明 目前看不懂

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
发表于 2017-2-10 21:06 | 显示全部楼层
bell6248 发表于 2017-2-10 10:43
需求很不明确 要详细说明 目前看不懂

我也是。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票7.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月30日前

活动链接>>
TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表