0

以下の機能の SQL クエリを作成する際に、特殊な問題に直面しています。以下の表を検討してください。

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

クエリに渡されたアカウント番号の最新のジョブ番号を取得したい。例: アカウント番号として 1234 を渡す場合は 1111113 を取得する必要があり、1212 を渡す場合は 1111131 を取得する必要があります。これを達成するための PL/SQL クエリの作成方法 のように複数の口座番号を渡しますAccountNumber IN ('1234','1212')。したがって、アカウント番号ごとに、最新のジョブ番号を取得する必要があります。

現在、私はこのように IN を使用せずに試しました:

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

Java JDBCでは、アカウント番号ArrayListをループし、Oracle dbに対してJDBCを実行しています。しかし、ご存知のように、4000 のアカウントのパフォーマンス ヒットがある場合、これは実行可能なソリューションではありません。

この SQL クエリの作成を手伝ってもらえますか?

編集: ここで、latest は最高のジョブ番号を意味します。たとえば、1111113 と 1111112 のうちです。1111113 は最新のデータです。

4

4 に答える 4

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

また

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

また

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> 
于 2012-11-29T11:00:08.327 に答える
1

単純な max() は機能しませんか?

SELECT max(JobNumber)
FROM TABLE1 
WHERE AccountNumber = ?

1 つのクエリで複数のアカウントの場合:

SELECT AccountNumber, max(JobNumber)
FROM TABLE1 
WHERE AccountNumber IN (?, ?, ?)
GROUP BY AccountNumber;
于 2012-11-29T11:00:59.997 に答える
0

最初に標準 SQL から始めます。以下がそれを行うことを願っています。

SELECT JobNumber 
FROM TABLE1 
WHERE id = (SELECT MIN(id)
           FROM TABLE1
           WHERE AccountNumber = ?)
于 2012-11-29T10:54:40.250 に答える
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
于 2012-11-29T10:59:44.607 に答える