红包
◆ [2024-4-26 星期五 4:38] ◆ 您来自:18.191.240.243,欢迎您访问風雲工作室。 收藏本站 ◆ | ◆ 设为首页
联系站长(腾讯QQ)
5029111 [風雲]
站长当前离线
首  页 论坛交流 游戏频道 无忧脚本 旧版论坛 云服务器 聊 天 室 自助链接 来访记录 访客留言 搜索提供
位置:風雲工作室 - 论坛交流 - 技术专栏 - 后台开发 - 【推荐】SQL显示每组数据中某列值为最大的一行 返回
主题:【推荐】SQL显示每组数据中某列值为最大的一行
Rimifon
★☆☆☆☆☆☆☆☆☆
积分:285
发帖:317
登录:2024/3/26
注册:2006/6/28
(1楼)【推荐】SQL显示每组数据中某列值为最大的一行
需要用到的语句:cross apply
例如,各部门每月都需要在规定日期之前上报多项数据,要求在每单位的各项数据中,列出上报时间最长的一项,并列出单位,应报时间、实报时间,迟报天数,相关表如下:
部门表:T_Dept(ID, Name, Sort)
上报项目:T_Item(ID, FinishDate)
报送记录:T_List(DeptID, ItemID, SendTime)
则对应的SQL语句如下:
select t1.Name, t2.* from (
        select * from T_Dept
-- 如果需要显示t2中的空白行,则取消下一行的注释
) t1 cross apply ( --(select null as empty) t outer apply (
        select top 1 FinishDate, AddDate,
        -- 如果有尚未上报的信息,则上报时间为当前时间
        DateDiff(Day, FinishDate, coalesce(AddDate, getdate())) as OffDay
        from T_Item a left join T_List b on a.ID=b.IdctID
        -- 排序,以选择最大的一行数据
        where b.DeptID=t1.ID order by OffDay desc
) t2


时间:2011年6月14日 22:22:27 IP:已记录 引用 回复
Rimifon
★☆☆☆☆☆☆☆☆☆
积分:285
发帖:317
登录:2024/3/26
注册:2006/6/28
(2楼)
实际测试发现,使用outer apply的性能要比left join的方式要更快更强大,因此,cross apply 比对应的inner join 应该也要快很多。这在两个需要运算的关联结果集,且其中存在复杂运算结果集时效果特别显著。


时间:2011年8月26日 18:03:03 IP:已记录 引用 回复

© Copyright 2006-2024,風雲工作室 All rights reserved.
湘ICP备05009306号QQ登录
操作 1 个库,连接 3 次,执行 8 次,耗时 78 毫秒。