2017-06-22 13 views
-1

給定TASK_ID,檢索每個文件的最新版本的最有效方法是什麼?檢索給定ID的每個文件名的最新版本的整行

這是我正在使用的示例表。

ID TASK_ID FILENAME VERSION_NUMBER RANDOM_COLUMN 
1  1   a.txt  1     112 
2  1   b.txt  1     231231 
3  1   c.txt  1     234356 
4  1   a.txt  2     35 
5  1   b.txt  2     84 
6  1   b.txt  3     97604 
7  2   aa.txt  1     6956 
8  2   bb.txt  1     9760054 

這是我到目前爲止。

SELECT FILENAME, TASK_ID, MAX(VERSION_NUMBER) 
FROM TABLE_NAME 
GROUP BY FILENAME, TASK_ID 
HAVING TASK_ID = '1'; 

不幸的是,上面只給我3列我在SELECT語句,而不是整個行並添加更多的列會給我一個錯誤。

FILENAME TASK_ID MAX(VERSION_NUMBER) 
a.txt  1   2 
b.txt  1   3 
c.txt  1   1 

我怎麼可能去獲得整個行?

我打算將這個SQL查詢添加到Spring存儲庫中的Query註釋中,並將其作爲本機查詢運行。這是最好的方法嗎?

編輯: 我結束了這個SQL查詢語句,它得到我想要的東西,但我不知道這是否是正確的或效率表現。

SELECT ta.* 
FROM TABLE_NAME ta 
INNER JOIN (SELECT FILENAME, TASK_ID, MAX(VERSION_NUMBER) vn 
    FROM TABLE_NAME 
    GROUP BY FILENAME, TASK_ID 
    HAVING TASK_ID = '1') sq 
ON ta.FILENAME = sq.FILENAME 
AND ta.TASK_ID = sq.TASK_ID 
AND ta.VERSION_NUMBER = sq.vn; 

結果上面的SQL查詢的

ID TASK_ID FILENAME VERSION_NUMBER RANDOM_COLUMN 
3  1   c.txt  1     234356 
4  1   a.txt  2     35 
6  1   b.txt  3     97604 

回答

0

使用row_number()

SELECT ta.* 
FROM (SELECT ta.*, 
      ROW_NUMBER() OVER (PARTITION BY FILENAME, TASK_ID ORDER BY VERSION_NUMBER DESC) as seqnum 
     FROM TASK_ARTIFACT ta 
    ) ta 
WHERE seqnum = 1; 
+0

您的查詢的結果包括在結果中SEQNUM。除了將SELECT語句從ta。*改爲ta.ID,ta.TASK_ID,ta.FILENAME等之外,是否還有其他方法不包含它? – dalawh

+0

@dalawh。 。 。只選擇你想要的列。回答問題時,我使用'select *'作爲方便。 –

0

是的,它是正確的,並沒有看到任何問題與您目前的做法(編輯之一)..我會做同樣的事情。除了在HAVING條件應該去WHERE

SELECT ta.* 
FROM TABLE_NAME ta 
INNER JOIN (SELECT FILENAME, TASK_ID, MAX(VERSION_NUMBER) vn 
    FROM TABLE_NAME 
    WHERE TASK_ID = '1' 
    GROUP BY FILENAME, TASK_ID 
) sq 
ON ta.FILENAME = sq.FILENAME 
AND ta.TASK_ID = sq.TASK_ID 
AND ta.VERSION_NUMBER = sq.vn; 
相關問題