50分求一查询方案的SQL语句具体实现

helloruby 2009-06-05 08:55:01
我在Oracle数据库有形如这样的一张表:

... 企业名称 所在省份 所在城市 交易时间 ...
... com pro city etime ...
... A SC XK 2008-11-01 11:00:00 ...
... B SC CD 2008-11-01 11:00:01 ...
... C GD XK 2008-11-01 11:00:02 ...
... B SC CD 2008-11-01 11:00:03 ...
... D SC CD 2008-11-01 11:00:04 ...

想实现的查询是:查出各个城市最新一批交易的企业信息
说明:
各个城市:多个省份中有可能有重名的城市,应该算不同的城市。比如sc.xk gd.xk
最新:以交易时间离现在最近的一个,如:B 2008-11-01 11:00:01 ,B 2008-11-01 11:00:03 应取后者
最新一批:应囊括一个城市中所有交易企业,如:sc.cd 有:B有两条记录,只取最新一条,D就一条记录,直接取其记录。

向大家请教该查询方案的最优SQL语句实现

谢谢帮忙触感!



...全文
78 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangfengxin 2009-06-07
  • 打赏
  • 举报
回复
UP
li_x1979 2009-06-07
  • 打赏
  • 举报
回复

设表名为:sometable

SELECT DISTINCT e.com,e.pro,e.city,(SELECT max(etime) FROM sometable WHERE e.com = com AND e.pro = pro AND e.city = city)
FROM sometable e;
wudan31 2009-06-05
  • 打赏
  • 举报
回复
有道理
sflight 2009-06-05
  • 打赏
  • 举报
回复
如果还有很多其他的字段,那就只好用not exists 了

Richard345265669 2009-06-05
  • 打赏
  • 举报
回复
select pro||city,com,max(etime) from test group by pro||city,com

正解
william3033 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 helloruby 的回复:]
我们写SQL的最终目标不只是实现查询功能就OK呢, 最终目标是 最优,最简单

一个稍复杂的查询用例肯定会有许多查询方案,我们肯定会探讨最优的!
另外语句应尽量避免使用substr之类的函数,因为各个数据库引擎同一功能的函数签名往往是不一样的。
[/Quote]
学习了。
helloruby 2009-06-05
  • 打赏
  • 举报
回复
我们写SQL的最终目标不只是实现查询功能就OK呢, 最终目标是 最优,最简单

一个稍复杂的查询用例肯定会有许多查询方案,我们肯定会探讨最优的!
另外语句应尽量避免使用substr之类的函数,因为各个数据库引擎同一功能的函数签名往往是不一样的。

helloruby 2009-06-05
  • 打赏
  • 举报
回复
热心的6#兄弟,如果还有其它筛选字段,按照SQL语法,这些筛选还须加入到分组条件中.
你说说,如果这样的话,查询结果难道会只是省份加城市的分组(只是"各个城市")吗?

其实我是寻找最优的查询方案,我用连接查询亦实现了
ojuju10 2009-06-05
  • 打赏
  • 举报
回复
up
william3033 2009-06-05
  • 打赏
  • 举报
回复
哥们,连接的字段你不会用substr拆分吗?
各个城市最新一批,上面已经都实现了。。只是把城市和省连在一起而已。。
helloruby 2009-06-05
  • 打赏
  • 举报
回复
我不需要Pro||city连接成一个字段。
select pro,city,com,max(etime) from test group by pro,city,com
用group by的话,select ...还有其它筛选字段也须纳入到分组字段中,这样应该达到不了各个城市最新一批的要求。
william3033 2009-06-05
  • 打赏
  • 举报
回复
select pro||city,com,max(etime) from test group by pro||city,com
测试可以。
william3033 2009-06-05
  • 打赏
  • 举报
回复
group by pro||city,com查找到max的etime
实现了你的要求不?
money8899 2009-06-05
  • 打赏
  • 举报
回复
关注
清风_X 2009-06-05
  • 打赏
  • 举报
回复
这就是答案了吧

[Quote=引用 14 楼 ling242a 的回复:]
SQL code
select com,pro,city,etime
from (select com,pro,city,etime,rank() over(partition by pro,city,com order by etime desc) rk
from tablename) a
where rk=1
[/Quote]
白发程序猿 2009-06-05
  • 打赏
  • 举报
回复

select com,pro,city,etime
from (select com,pro,city,etime,rank() over(partition by pro,city,com order by etime desc) rk
from tablename) a
where rk=1

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧