遇到问题编写使用MAX功能
我有意见的用户的表作出了关于产品的查询:遇到问题编写使用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,我可以从那里弄清楚。不知道为什么我今天无法理解这一点。
我会用MAX...KEEP..DENSE_RANK
的方法写这个。
一些非正式的基准标记我做了一段时间后(这可能是过时的),表明该使用较少的资源(内存,专),比分析row_number()
方法。
这不是你想要的吗?
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()
。
大概意思是从第二个查询中删除'只提取第一行' –
我确实需要l_id,但是你的代码只返回了1行。每个L_id至少应该有1行。 –
@AaronDietz - 我认为你是对的,当我把这条线看起来似乎工作。 –
我同意 - 如果所有需要的都是这个聚合查询(似乎是这种情况),那么用分析函数嘲笑它会做很多工作。 – mathguy
我与此同时,因为它似乎更简单,并为我工作,但两个答案确实工作。我只是因为Gordon已经有很多代表而给Matt了复选标记。 :O) –