12
返回列表 发新帖
楼主: flzhang

求一条高效SQL的实现

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
11#
发表于 2017-3-2 10:03 | 只看该作者
select * from(
select round(id/2) id2,t0.*,'in'tm1,lead(tm)over(partition by ceil(id/2),emp_id order by val desc) from t0
)
where mod(id,2)=1;

  ID2         ID     EMP_ID EMP_NM VAL    TM       TM1  LEAD(TM)
----- ---------- ---------- ------ ------ -------- ---- --------
    1          1        100 NM     OUT    1100     in   1200
    2          3        100 NM     OUT    1300     in   1400
    3          5        200 NM1    OUT    1300     in   1330
    4          7        300 NM2    OUT    1500     in   1530

使用道具 举报

回复
论坛徽章:
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
12#
发表于 2017-3-2 11:46 | 只看该作者



测试如下:

SQL> select * from pps;

        ID     EMP_ID EMP_NM VAL TM
---------- ---------- ------ --- ----
         1        100 NM     OUT 1100
         2        100 NM     IN  1200
         3        100 NM     OUT 1300
         4        100 NM     IN  1400
         5        200 NM1    OUT 1300
         6        200 NM1    IN  1330
         7        300 NM2    OUT 1500
         8        300 NM2    IN  1530

8 rows selected

SQL>
SQL> select  id,
  2          emp_id,
  3          emp_nm,
  4          'OUT' val,
  5          max(decode(val, 'OUT', tm, null)) tm,
  6          'IN' valin,
  7          max(decode(val, 'IN', tm, null)) tmin
  8  from
  9  (select dense_rank() over(order by rn) id,
10          emp_id,
11          emp_nm,
12          val,
13          tm
14    from (select a.*,
15                 max(decode(val, 'OUT', id, 0)) over(order by id) rn
16            from pps a))
17  group by id, emp_id, emp_nm
18  order by 1;

        ID     EMP_ID EMP_NM VAL TM   VALIN TMIN
---------- ---------- ------ --- ---- ----- ----
         1        100 NM     OUT 1100 IN    1200
         2        100 NM     OUT 1300 IN    1400
         3        200 NM1    OUT 1300 IN    1330
         4        300 NM2    OUT 1500 IN    1530

SQL>



使用道具 举报

回复
论坛徽章:
32
优秀写手
日期:2014-07-23 06:00:13技术图书徽章
日期:2016-08-05 10:29:11秀才
日期:2016-08-05 10:33:40秀才
日期:2016-08-05 10:34:04秀才
日期:2016-08-05 10:34:04技术图书徽章
日期:2016-08-05 10:34:13秀才
日期:2016-08-05 10:38:01秀才
日期:2016-08-05 10:38:26秀才
日期:2016-08-05 10:38:26技术图书徽章
日期:2016-08-05 10:38:34
13#
 楼主| 发表于 2017-3-2 14:57 | 只看该作者
bell6248 发表于 2017-3-1 22:00
如语句可以得到结果1,接下来就是用我前面说的

select   dense_rank() over(order by t.rn)  id,
...

谢谢您啊,这种方式是可以的,但因为是sqlserver 2008,不支持max()over(order by) 这种方式,但我也学习了,谢谢

使用道具 举报

回复
论坛徽章:
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
14#
发表于 2017-3-2 15:08 | 只看该作者
flzhang 发表于 2017-3-2 14:57
谢谢您啊,这种方式是可以的,但因为是sqlserver 2008,不支持max()over(order by) 这种方式,但我也学习 ...

sql server早就支持了, 除非目前使用的的数据库版本非常低

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:22SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09秀才
日期:2016-03-24 09:10:24秀才
日期:2016-12-05 11:16:06
15#
发表于 2017-4-25 11:53 | 只看该作者
  1. with t as (
  2. SELECT 1 ID, 100 EMP_ID,'NM' EMP_NM,'OUT' VAL ,'1100' TM
  3. FROM DUAL
  4. UNION ALL
  5. SELECT 2 ID, 100 EMP_ID,'NM' EMP_NM,'IN' VAL , '1200' TM
  6. FROM DUAL
  7. UNION ALL
  8. SELECT 3 ID, 100 EMP_ID,'NM' EMP_NM,'OUT' VAL ,'1300' TM
  9. FROM DUAL
  10. UNION ALL
  11. SELECT 4 ID, 100 EMP_ID,'NM' EMP_NM,'IN' VAL , '1400' TM
  12. FROM DUAL
  13. UNION ALL
  14. SELECT 5 ID, 200 EMP_ID,'NM1' EMP_NM,'OUT' VAL ,'1300' TM
  15. FROM DUAL
  16. UNION ALL
  17. SELECT 6 ID, 200 EMP_ID,'NM1' EMP_NM,'IN' VAL,'1330' TM
  18. FROM DUAL
  19. UNION ALL
  20. SELECT 7 ID, 300 EMP_ID,'NM2' EMP_NM,'OUT' VAL,'1500' TM
  21. FROM DUAL
  22. UNION ALL
  23. SELECT 8 ID, 300 EMP_ID,'NM2' EMP_NM,'IN' VAL,'1530' TM
  24. FROM DUAL )
  25. select id,emp_id,emp_nm,max(val) val,max(tm) tm,max(valin) valin,max(tmin) tmin from (
  26. select round(id/2) id,emp_id,emp_nm,decode(val,'OUT',val,null) val,decode(val,'OUT',TM,null) TM,
  27. decode(val,'IN',val,null) valin,decode(val,'IN',TM,null) TMIN from t) group by id ,emp_id,emp_nm order by 1
复制代码

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表