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

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

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

[复制链接]
论坛徽章:
30
优秀写手
日期:2014-07-23 06:00:13秀才
日期:2016-08-05 10:38:01秀才
日期: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
发表于 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实现这个排序功能
谢谢各位了









论坛徽章:
122
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 )

使用道具 举报

回复
论坛徽章:
30
优秀写手
日期:2014-07-23 06:00:13秀才
日期:2016-08-05 10:38:01秀才
日期: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
 楼主| 发表于 2017-2-9 22:46 | 显示全部楼层
bell6248 发表于 2017-2-9 17:03
数据没有贴全, 贴出测数据样例脚本, 把最终结果贴出来

重新整理了,可以看了

使用道具 举报

回复
论坛徽章:
450
秀才
日期:2015-08-18 09:49:27秀才
日期:2015-10-10 11:14:46秀才
日期:2015-10-10 11:14:46举人
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01状元
日期:2015-09-09 10:34:21榜眼
日期:2015-09-09 10:34:21秀才
日期: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脚本,以及预期结果。

使用道具 举报

回复
认证徽章
论坛徽章:
196
2016猴年福章
日期:2016-02-18 09:31:302016猴年福章
日期:2016-02-23 09:58:34猴赛雷
日期:2016-02-23 10:04:242017金鸡报晓
日期:2017-01-10 15:29:032017金鸡报晓
日期:2017-02-08 14:09:13
发表于 2017-2-10 08:24 | 显示全部楼层
把你的预期结果 和 表结构 和 测试数据给一下,用excel 画一下也可以的。

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
认证徽章
论坛徽章:
6322
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

使用道具 举报

回复
论坛徽章:
122
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 来自手机 | 显示全部楼层
需求很不明确 要详细说明 目前看不懂

使用道具 举报

回复
论坛徽章:
390
宝马
日期:2013-11-22 20:41:54马上加薪
日期:2014-02-19 11:55:14马上有钱
日期:2014-03-11 11:59:122014年世界杯参赛球队:喀麦隆
日期: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
发表于 2017-2-10 21:06 | 显示全部楼层
bell6248 发表于 2017-2-10 10:43
需求很不明确 要详细说明 目前看不懂

我也是。

使用道具 举报

回复

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

本版积分规则

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