我有一个用户对产品的评论表:
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的缩写)将其链接回产品表,因此我需要为每个L_ID做出最后一条评论(通过Comment_TS字段,这是一个时间戳)。我正在使用Oracle 12C,但如果有人可以直接使用SQL,我可以从中找到它。不知道为什么今天我无法理解这一点。
答案 0 :(得分: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()
。
答案 1 :(得分:2)
我会用MAX...KEEP..DENSE_RANK
方法写这个。
select l_id,
max(comments) keep ( dense_rank first order by comments_ts desc),
max(comments_ts)
from d
group by l_id;
我做了一些非正式的基准测试(可能已经过时),表明这比使用分析row_number()
方法使用更少的资源(特别是内存)。