Sql 使用MAX函数编写查询时遇到问题
我有一个用户对产品的评论表:Sql 使用MAX函数编写查询时遇到问题,sql,oracle,greatest-n-per-group,oracle12c,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.
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的缩写)将其链接回product表,因此我需要对每个L_ID进行最后一次注释(通过comment_TS字段,这是一个时间戳)。我使用的是Oracle 12C,但如果有人可以直接使用SQL,我可以从中找出答案。我不知道为什么我今天没办法解决这个问题。这不是你想要的吗
select fb.*
from f_feedback
order by comments_ts desc
fetch first 1 row only;
如果每个l\u id
都需要此代码,请使用row\u number()
:
如果您希望所有注释都具有相同的最新时间戳,那么请使用
rank()
而不是row\u number()
这不是您想要的吗
select fb.*
from f_feedback
order by comments_ts desc
fetch first 1 row only;
如果每个l\u id
都需要此代码,请使用row\u number()
:
如果您希望所有注释都具有相同的、最新的时间戳,那么请使用
rank()
而不是row\u number()
,我将使用MAX…KEEP..densite\u 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()
方法使用的资源(特别是内存)要少。我会用MAX…KEEP..densite_-RANK
方法写这篇文章
select l_id,
max(comments) keep ( dense_rank first order by comments_ts desc),
max(comments_ts)
from d
group by l_id;
我不久前做的一些非正式基准测试(可能已经过时)表明,这比分析的
行数()方法使用的资源(特别是内存)要少。可能意味着从第二个查询中删除仅获取第一行
,我确实需要l\u id,但您的代码总共只返回了一行。每个L_id至少应该有一行。@Arondietz-我想你是对的,当我把那行拿出来时,它似乎起作用了。@JohnnyBones-你说每个L_id至少有一行是什么意思?对于相同的L\u ID
,是否可以有两个时间戳完全相同的注释?如果是这样的话,您需要同时返回两个吗?如果超过两个,您需要全部返回吗?这就是马修的聚合解决方案的弱点;在这种情况下,每个L_ID
只能返回一行,并且需要Gordon的分析函数方法。但是,要获取具有最新时间戳的所有行,您必须将行编号
更改为秩
(其他内容保持不变)。@mathguy您是对的。但是,在一个由人输入注释并且要求显示最新注释的系统中,我无法想象他们会希望看到两条“最新”注释,因为它们恰好在毫微秒的时间内出现。可能是为了从第二个查询中删除仅获取第一行
,我确实需要l_id,但是您的代码总共只返回了1行。每个L_id至少应该有一行。@Arondietz-我想你是对的,当我把那行拿出来时,它似乎起作用了。@JohnnyBones-你说每个L_id至少有一行是什么意思?对于相同的L\u ID
,是否可以有两个时间戳完全相同的注释?如果是这样的话,您需要同时返回两个吗?如果超过两个,您需要全部返回吗?这就是马修的聚合解决方案的弱点;在这种情况下,每个L_ID
只能返回一行,并且需要Gordon的分析函数方法。但是,要获取具有最新时间戳的所有行,您必须将行编号
更改为秩
(其他内容保持不变)。@mathguy您是对的。但是,在一个由人输入注释并且要求显示最新注释的系统中,我无法想象他们会希望看到两条“最新”注释,因为它们恰好以毫微秒的速度出现。我同意-如果只需要这个聚合查询(似乎是这样的情况),然后用解析函数来模拟它会做太多的工作,我选择了这个,因为它看起来更简单,对我来说很有效,但两个答案都有效。我给马特打勾只是因为戈登已经有很多代表了o) 我同意——如果只需要这个聚合查询(似乎是这样),那么用分析函数模拟它就太麻烦了。我之所以这么做,是因为它看起来更简单,对我来说也有效,但两个答案都有效。我给马特打勾只是因为戈登已经有很多代表了o)
select l_id,
max(comments) keep ( dense_rank first order by comments_ts desc),
max(comments_ts)
from d
group by l_id;