新足迹

 找回密码
 注册

精华好帖回顾

· 亲子摄影活动 - Fun Day At The Bay (2013-8-1) 胡椒老罗 · 毛毛虫来啦~~~ (2007-10-16) 紫雪花
· 风玲教学日记之二―儿童的行为―2. Understanding children了解一点儿童心理学知识 (2008-12-17) 风玲 · 美容记 Ella Bache student salon signature facial experience (2007-8-31) 甜螺
Advertisement
Advertisement
查看: 1842|回复: 19

简单的oracle SQL问题 [复制链接]

发表于 2013-9-5 13:14 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 porcorosso 于 2013-9-5 16:03 编辑
  1. ID         KEYWORD(VARCHAR255)         TIMESTAMP
  2. ---------------------------------
  3. 1        abc                                        01/SEP/13
  4. 2        123                                        01/SEP/13
  5. 3        abc                                        01/SEP/13
  6. 4        123                                        02/SEP/13
  7. 5        456                                        02/SEP/13
  8. 6        zxc                                        02/SEP/13
  9. 7        zxc                                        03/SEP/13
  10. 8        456                                        03/SEP/13
  11. 9        abc                                        04/SEP/13
  12. 10        abc                                        05/SEP/13
复制代码
问:如何建立optimised query来读取 "top 2 unique keywords with it's latest timestamp"

答案应该是

  1. abc        05/SEP/13
  2. 456        03/SEP/13
复制代码

评分

参与人数 1积分 +4 收起 理由
jingjingying + 4

查看全部评分

Advertisement
Advertisement

发表于 2013-9-5 13:41 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
select keyword,timestamp from table_name where keyword in (select keyword from (select keyword,RANK() OVER (ORDER BY no DESC) rankno from (select keyword,count(*) no from table_name group by keyword)) where rankno=2);

评分

参与人数 1积分 +2 收起 理由
jerrywang + 2 怎么混上银靴的?

查看全部评分

签名不可外链

发表于 2013-9-5 14:26 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
stevenbian 发表于 2013-9-5 12:41
select keyword,timestamp from table_name where keyword in (select keyword from (select keyword,RANK( ...

魔鬼教兽:

"group by" 很heavy,尤其是对String,大table

发表于 2013-9-5 14:34 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
porcorosso 发表于 2013-9-5 13:26
魔鬼教兽:

"group by" 很heavy,尤其是对String,大table

表设计成这个样子,不做大变动也没什么办法避免group by了
like hell

发表于 2013-9-5 14:35 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Fernando 发表于 2013-9-5 13:34
表设计成这个样子,不做大变动也没什么办法避免group by了

帮忙进行修改?

发表于 2013-9-5 14:41 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
porcorosso 发表于 2013-9-5 13:35
帮忙进行修改?

这就是个简单记录的表吧?我估计你这keyword有重复是必要的,没法直接改这个表。
你讲讲应用背景吧,如果偶尔排序一次,group by 就group by吧
like hell
Advertisement
Advertisement

发表于 2013-9-5 14:52 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 porcorosso 于 2013-9-5 16:43 编辑

english is easier to type and explain

there is a free text single input search form. when user enter the search keywords, the keywords will store into "keyword" column in the given table. there is a "user_id" column to remember the user too.

when user next time visiting the page, i like to get the 2 most recent unique entered keywords, and show them on the screen, so that user can click on these keywords and the form will submit automatically, i.e. user does not have to type again.

this feature is built from scratch, so both table and query can be fully altered.

可以吗?

发表于 2013-9-5 15:04 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
5 most recent unique entered keywords, 是针对这个user还是整个表的? 这五个keyword要求real-time吗? 如果表太大,每次group by 排序太慢,那就建个keyword unique的表,用trigger来维护时间排序
like hell

发表于 2013-9-5 16:53 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
stevenbian 发表于 2013-9-5 12:41
select keyword,timestamp from table_name where keyword in (select keyword from (select keyword,RANK( ...

刚试了,不对

发表于 2013-9-5 17:06 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SELECT TOP 5 Keyword,MAX(TimeStamp) FROM ThisTable
GROUP BY Keyword
ORDER BY MAX(TimeStamp) desc

评分

参与人数 3积分 +4 收起 理由
stevenbian + 1 Oracle
porcorosso + 2 我很赞同
jerrywang + 1 我很赞同

查看全部评分

发表于 2013-9-5 17:09 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
  1. select * from (
  2.   select keyword, max (timestamp) ts
  3.   from table_name
  4.   group by keyword
  5.   order by ts desc
  6. ) where rownum<=2;
复制代码
还真不知道是不是optimized的query。。。

评分

参与人数 1积分 +2 收起 理由
Fernando + 2 我很赞同

查看全部评分

Advertisement
Advertisement

发表于 2013-9-5 17:14 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 porcorosso 于 2013-9-5 16:16 编辑
北风 发表于 2013-9-5 16:06
SELECT TOP 5 Keyword,MAX(TimeStamp) FROM ThisTable
GROUP BY Keyword
ORDER BY MAX(TimeStamp) desc

  

发表于 2013-9-5 17:18 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
like hell

发表于 2013-9-5 17:19 |显示全部楼层
此文章由 fans2150 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fans2150 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Can you use DISTINCT key word for the unique key words?

发表于 2013-9-5 17:37 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
fans2150 发表于 2013-9-5 16:19
Can you use DISTINCT key word for the unique key words?

distinct is as bad as group by

发表于 2013-9-5 17:39 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
被楼主彻底打败了
top 5 居然是5 most recent unique entered keywords
Advertisement
Advertisement

发表于 2013-9-5 17:40 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
select * from (
  select tbl1.keyword, tbl1.timestamp
  from table_name tbl1
  where not exists (
    select 1 from table_name tbl2 where  tbl2.keyword = tbl.keyword and tbl2.timestamp > tbl1.timestamp
  )
  order by tbl1.timestamp desc
) where rownum<=2;

/*"keyword" is indexed column*/

以上比我的第一个solution快

发表于 2013-9-5 17:51 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
porcorosso 发表于 2013-9-5 16:40
select * from (
  select tbl1.keyword, tbl1.timestamp
  from table_name tbl1

你把sql plan贴出来看看,现在新版本应该不吃这套了 ;p
like hell

发表于 2013-9-5 18:02 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
GROUP BY

  1. ----------------------------------------------------------
  2. | Id  | Operation               | Name                   |
  3. ----------------------------------------------------------
  4. |   0 | SELECT STATEMENT        |                        |
  5. |   1 |  COUNT STOPKEY          |                        |
  6. |   2 |   VIEW                  |                        |
  7. |   3 |    SORT ORDER BY STOPKEY|                        |
  8. |   4 |     HASH GROUP BY       |                        |
  9. |   5 |      TABLE ACCESS FULL  | TABLE_NAME |
  10. ----------------------------------------------------------
复制代码
JOIN

  1. ------------------------------------------------------------------
  2. | Id  | Operation                       | Name                   |
  3. ------------------------------------------------------------------
  4. |   0 | SELECT STATEMENT                |                        |
  5. |   1 |  COUNT STOPKEY                  |                        |
  6. |   2 |   VIEW                          |                        |
  7. |   3 |    SORT ORDER BY STOPKEY        |                        |
  8. |   4 |     MERGE JOIN ANTI             |                        |
  9. |   5 |      TABLE ACCESS BY INDEX ROWID| TABLE_NAME |
  10. |   6 |       INDEX FULL SCAN           | INDEX2                 |
  11. |   7 |      FILTER                     |                        |
  12. |   8 |       SORT JOIN                 |                        |
  13. |   9 |        TABLE ACCESS FULL        | TABLE_NAME |
  14. ------------------------------------------------------------------
复制代码

发表于 2013-9-9 22:04 |显示全部楼层
此文章由 haidai 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 haidai 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表回复

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

本版积分规则

Advertisement
Advertisement
返回顶部