2017-02-24 48 views
0

我有一個數據庫是AUD_entitiy_type。我有一個非常簡單的查詢:從實體審計中選擇最低版本號

SELECT id, REV, status_1, status_2, status_3, status_4, code 
FROM AUD_entitiy_type --Audit table 
WHERE (status_1 LIKE 'A%' AND status_2 IS NULL 
    OR (status_1 LIKE 'B%' AND status_2 IS NULL) 
    OR (status_1 LIKE 'C%' AND status_2 IS NULL)) 

基本上我拿到了A,B或C的STATUS_1所有實體(可以是A1,A2 ......)。

審計表有一個實體發生的每個更新的條目,即A2更改爲B1。

與查詢我得到這樣

id REV status_1 status_2 status_3 status_4 
1  100 A1   NULL  NULL  NULL 
1  112 B1   NULL  NULL  NULL 
1  131 A3   NULL  NULL  NULL 
2  135 A1   NULL  NULL  NULL 
3  142 A6   NULL  NULL  NULL 

結果我需要的是在有具有相同的ID(1以上)多個實體的情況下得到了一個最低的REV(100以上)。

我的研究不太遺憾,因爲我不確定要使用的關鍵字。有最小值給出havingmin這似乎並不是我所期待的,因爲在這個例子中我仍然想要2和3.

可能有很多規範化在這裏我知道,但5年前我沒有在這裏工作,這個應用程序目前正在運行(我有一個JIRA的更新;))

回答

2

您可以使用窗口功能(ROW_NUMBER)內的子查詢。

SELECT a.id, a.REV, a.status_1, a.status_2, a.status_3, a.status_4, a.code 
FROM (
    SELECT id, REV, status_1, status_2, status_3, status_4, code, 
      ROW_NUMBER() OVER (PARTITION BY id ORDER BY REV) AS RowNumber 
    FROM AUD_entitiy_type --Audit table 
    WHERE (status_1 LIKE 'A%' AND status_2 IS NULL 
     OR (status_1 LIKE 'B%' AND status_2 IS NULL) 
     OR (status_1 LIKE 'C%' AND status_2 IS NULL)) 
) a 
WHERE 
    a.RowNumber = 1;