Нужна помощь в написании SQL-запроса
Я сталкиваюсь с особой проблемой при написании 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 и выполняю JDBC против базы данных Oracle. Но, как вы знаете, это невыполнимое решение, если имеется 4000 обращений к производительности учетных записей.
Можете ли вы помочь в написании этого SQL-запроса?
РЕДАКТИРОВАТЬ: Здесь последний означает самое высокое количество рабочих мест, например: из 1111113 и 1111112. 1111113 - последние данные
4 ответа
Есть несколько способов:
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>
Разве простой max() не сработает?
SELECT max(JobNumber)
FROM TABLE1
WHERE AccountNumber = ?
И для нескольких аккаунтов в одном запросе:
SELECT AccountNumber, max(JobNumber)
FROM TABLE1
WHERE AccountNumber IN (?, ?, ?)
GROUP BY AccountNumber;
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
Сначала я бы начал со стандартного SQL. Я надеюсь, что следующее делает это.
SELECT JobNumber
FROM TABLE1
WHERE id = (SELECT MIN(id)
FROM TABLE1
WHERE AccountNumber = ?)