使用MAX函数编写查询时遇到问题

时间:2017-10-16 20:44:37

标签: sql oracle greatest-n-per-group oracle12c

我有一个用户对产品的评论表:

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,我可以从中找到它。不知道为什么今天我无法理解这一点。

2 个答案:

答案 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()方法使用更少的资源(特别是内存)。

相关问题