2012-11-29 105 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,是不是? –