SQL запрос на извлечение аккаунтов, чья последняя дата загрузки не равна сегодняшней - PullRequest
0 голосов
/ 17 января 2020

У меня, похоже, есть проблема в запросе, и мне нужна ваша помощь.

У меня есть 2 таблицы:

1-я таблица содержит данные банковского счета - номер счета, статус и т. Д. c - banka cc

Во 2-й таблице хранится название выписки и дата загрузки, в которую импортируется выписка - bankstm

Я пытаюсь написать запрос, который будет заполнять только те банковские счета, чьи оператор не был импортирован на сегодняшнюю дату.

Формат даты в базе данных - 2020-01-17 00:00:00.000

Код, который я пробовал:

SELECT b.bank_acc as Bank_Account, max(b.date_ld) as Load_Date from bankstm b 
where  b.date_ld < CAST(GETDATE() AS DATE) and 
b.bank_acc in (select a.acc_no from bankacc a where a.in_use = 'Y' and a.analyse03 = '1517') 
group by b.bank_acc

Этот код заполняет все записи с предыдущей даты, тогда как большинство из них загружены сегодня.

Я также попытался выполнить код с помощью '=' или '<>' или '>' на основе запросов, ранее возникших при переполнении стека. Но, кажется, ничто не дает мне правильный результат.

Итак, наконец, я поднимаю вопрос для экспертов, чтобы помочь мне.

Ответы [ 4 ]

1 голос
/ 17 января 2020

Прежде всего вы можете улучшить свой запрос с помощью объединения и избегать использования подзапроса.

SELECT b.bank_acc as Bank_Account, max(b.date_ld) as Load_Date 
FROM bankstm AS b 
LEFT JOIN bankacc AS ba ON b.bank_acc = ba.acc_no
WHERE ba.in_use = 'Y' 
AND ba.analyse03 = '1517'
GROUP BY b.bank_acc
HAVING CAST(MAX(b.date_ld) AS DATE) < CAST(GETDATE() AS DATE) 
0 голосов
/ 17 января 2020

Я бы использовал not exists:

select ba.*
from bankacc ba
where ba.in_use = 'Y' and
      ba.analyse03 = '1517' and
      not exists (select 1
                  from bankstm bs
                  where bs.bank_acc = ba.acc_no and
                        bs.date_ld = convert(date, getdate())
                 );

Для производительности вам нужны индексы на bankacc(in_use, analyse03, acc_no) и bankstm(bank_acc, date_ld).

0 голосов
/ 17 января 2020

Вы можете изменить свое заявление, чтобы использовать not not, если единственным критерием является то, что запись не имеет соответствующей записи для сегодняшней даты в качестве даты загрузки. Если критерии разные, может потребоваться модификация.


SELECT [b].[bank_acc] AS     [bank_account]
     , MAX([b].[date_ld]) AS [load_date]
FROM   bankstm AS b
WHERE  NOT EXISTS
(
    SELECT 1
    FROM   [bankstm] AS [bb]
    WHERE  [b].[bank_acc] = [bb].[bank_acc] AND 
           TRY_CONVERT(DATE, [bb].[date_ld]) = TRY_CONVERT(DATE, GETDATE())
)
AND EXISTS
(
    SELECT 1
    FROM   [bankacct] a
    WHERE  b.bank_acc = a.bank_acc and a.in_use = 'Y' and a.analyse03 = '1517'
)
GROUP BY b.bank_acc
;
0 голосов
/ 17 января 2020

Вам необходимо применить фильтр даты на макс. Я приведу максимум (b.date_ld) к дате в случае, если ее формат даты и времени

SELECT b.bank_acc as Bank_Account, max(b.date_ld) as Load_Date from bankstm b 
where   
b.bank_acc in (select a.acc_no from bankacc a where a.in_use = 'Y' and a.analyse03 = '1517') 
group by b.bank_acc
having cast(max(b.date_ld) as date) < CAST(GETDATE() AS DATE)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...