2012-11-29 103 views
0

我在寫一個SQL查詢以下功能面臨pecular問題的SQL查詢: 考慮見下表:需要幫助書面

--------------------------------- 
AccountNumber  JobNumber 
--------------------------------- 
    1234   1111113 
    1234   1111112 
    1234   1111111 
    1212   1111131 
    1212   1111132 

我想獲取傳遞給一個賬號一個最新的工號查詢。例如:如果我通過1234作爲賬號,我需要得到1111113,如果我通過1212,我應該得到1111131.如何編寫一個PL/SQL查詢來實現這一點?我們會通過多個帳號,如AccountNumber IN ('1234','1212')。所以對於每個帳號我需要獲得最新的工作號碼。

目前我已經嘗試不使用像這樣:

SELECT * 
    FROM (SELECT JobNumber 
      FROM TABLE1 
      WHERE AccountNumber = ?) 
WHERE ROWNUM = 1 

,並在Java中的JDBC我循環thorugh賬號ArrayList和針對Oracle數據庫執行JDBC。但如你所知,這不是一個可行的解決方案,如果有4000個帳戶的性能點擊。

你可以幫忙寫這個SQL查詢嗎?

編輯:這裏指最新最高jobnumber可以爲如:出1111113和1111112. 1111113是最新的數據

+0

你所說的 「最新」 是什麼意思?如果沒有要排序的日期/時間列,則從數據庫的角度來看「最新」是未定義的。 – Mat

+0

@Mat,剛剛編輯。 –

回答

1

有幾種方法:

SQL> create table t1(AccountNumber, JobNumber) as 
    2 (
    3 select 1234, 1111113 from dual union all 
    4 select 1234, 1111112 from dual union all 
    5 select 1234, 1111111 from dual union all 
    6 select 1212, 1111131 from dual union all 
    7 select 1212, 1111132 from dual 
    8 ) 
    9 ; 

Table created 




SQL> select t.AccountNumber 
    2  , max(t.JobNumber) as JobNumber 
    3 from t1 t 
    4 where AccountNumber in (1212, 1234) -- for example 
    5 group by AccountNumber 
    6 ; 

ACCOUNTNUMBER JOBNUMBER 
------------- ---------- 
     1234 1111113 
     1212 1111132 

OR

SQL> select AccountNumber 
    2  , JobNumber 
    3 from (select t.AccountNumber 
    4    , t.JobNumber 
    5    , row_number() over(partition by t.AccountNumber order by t.JobNumber desc) rn 
    6    from t1 t 
    7   where AccountNumber in (1212, 1234) -- for example 
    8  ) t 
    9 where t.rn = 1 
    10 ; 

ACCOUNTNUMBER JOBNUMBER 
------------- ---------- 
     1212 1111132 
     1234 1111113 

OR

SQL> select AccountNumber 
    2  , JobNumber 
    3 from (select t.AccountNumber 
    4    , t.JobNumber 
    5    , max(JobNumber) over(partition by t.AccountNumber) mjn 
    6    from t1 t 
    7   where AccountNumber in (1212, 1234) -- for example 
    8  ) t 
    9 where t.JobNumber = t.mjn 
    10 ; 

ACCOUNTNUMBER JOBNUMBER 
------------- ---------- 
     1212 1111132 
     1234 1111113 

SQL> 
+0

3是哪一個是最好的方法? –

+0

@pradeepsimha對於你提供的第一組數據,這將是可取的。 –

0

我將與標準的SQL首先啓動。我希望以下是它。

SELECT JobNumber 
FROM TABLE1 
WHERE id = (SELECT MIN(id) 
      FROM TABLE1 
      WHERE AccountNumber = ?) 
0
select a, j1 
from(    
select 
     id, 
     a, 
     j, 
     first_value(j) over(partition by a order by id) j1 
from (    
    select AccountNumber a, JobNumber j, row_number() over(order by 0) id 
    from table1) t 
    ) t1 
group by a, j1 
1

不會簡單MAX()工作?

SELECT max(JobNumber) 
FROM TABLE1 
WHERE AccountNumber = ? 

以及在一個查詢多個賬戶:

SELECT AccountNumber, max(JobNumber) 
FROM TABLE1 
WHERE AccountNumber IN (?, ?, ?) 
GROUP BY AccountNumber; 
+1

如果你傳遞1212你應該得到1111131,但是你的查詢返回1111132,是不是? –