2017-10-16 97 views
0

我有意见的用户的表作出了关于产品的查询:遇到问题编写使用MAX功能

FBID L_ID Comments       Comments_TS    User 
110 9885 Testing counting of feedback IDs 07-APR-17 02.52.01.495927000 PM  AMOWIN 
111 9885 Test how adding additional comments 07-APR-17 02.52.56.357410000 PM  AMOWIN 
112 9911 Test the duplication of plans on 07-APR-17 03.09.27.885587000 PM  AMOWIN 
113 9950 Testing pending for source doc  10-APR-17 12.03.19.303782000 PM  AMOWIN 
116 10218 testing initial feedback sent  02-MAY-17 09.55.59.174925000 AM  AMOWIN 
126 12758 Testing Feedback, Get Next Disabled 12-JUN-17 09.41.15.979093000 AM  AMOWIN 
127 12758 jjjjjjjjjjjjjjjjjjjjjjjjjjjjj  12-JUN-17 11.17.23.742109000 AM  MABAXT 
128 12758 Testing status      12-JUN-17 12.05.32.354178000 PM  SWMART 
129 12758 Testing returning to CSE   12-JUN-17 12.06.09.276945000 PM  AMOWIN 
130 12758 2nd Test       12-JUN-17 01.52.08.540984000 PM  AMOWIN 

,我需要做的是只能取得最后的(即最近的)记录评论。我试过,但它甚至还没有接近:

SELECT MAX(Comments_TS), L_ID, COMMENTS 
FROM F_FEEDBACK FB1 
Group By L_ID, Comments; 

我最后需要链接此返回产品表由L_ID(简称Line_ID),所以我需要最后提出的意见(由Comment_TS场,这是一个时间戳)为每个L_ID。我正在使用Oracle 12C,但是如果任何人都可以直接使用SQL,我可以从那里弄清楚。不知道为什么我今天无法理解这一点。

回答

2

我会用MAX...KEEP..DENSE_RANK的方法写这个。

一些非正式的基准标记我做了一段时间后(这可能是过时的),表明该使用较少的资源(内存,专),比分析row_number()方法。

+0

我同意 - 如果所有需要的都是这个聚合查询(似乎是这种情况),那么用分析函数嘲笑它会做很多工作。 – mathguy

+0

我与此同时,因为它似乎更简单,并为我工作,但两个答案确实工作。我只是因为Gordon已经有很多代表而给Matt了复选标记。 :O) –

2

这不是你想要的吗?

select fb.* 
from f_feedback 
order by comments_ts desc 
fetch first 1 row only; 

如果需要此为每个l_id,然后使用row_number()

select fb.* 
from (select fb.*, 
      row_number() over (partition by l_id order by comments_ts desc) as seqnum 
     from f_feedback fb 
    ) fb 
where seqnum = 1; 

如果你想用相同的,最近,时间戳的所有意见,然后用rank(),而不是row_number()

+0

大概意思是从第二个查询中删除'只提取第一行' –

+0

我确实需要l_id,但是你的代码只返回了1行。每个L_id至少应该有1行。 –

+0

@AaronDietz - 我认为你是对的,当我把这条线看起来似乎工作。 –