2017-10-16 126 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 - 我認爲你是對的,當我把這條線看起來似乎工作。 –