Запрос, который обнаруживает разницу между учетными записями / нагрузками от СЕГОДНЯ и ВЧЕРА - PullRequest
1 голос
/ 22 октября 2019

ЦЕЛЬ: ОБНАРУЖИТЬ любую разницу между вчерашними нагрузками на таблицы и сегодняшними нагрузками. Каждая загрузка загружает значения данных, которые связаны с банковскими счетами. Поэтому мне нужен запрос, который возвращает каждую отдельную учетную запись, у которой есть разница, со значением в имени столбца.

Мне нужны данные из нескольких столбцов, которые расположены из двух разных таблиц. AEI_GFXAccounts и AEI_GFXAccountSTP. Каждый раз, когда таблица загружается, она имеет «run_ID», который увеличивается на единицу. Так что его нужно сравнить с MAX(run_id) и MAX(run_id) -1.

Я пробовал следующие запросы. Все, что делает этот запрос - возвращает все нужные мне столбцы. Теперь мне нужно реализовать логику, которая выполняет эти запросы WHERE runID = MAX(runID). Затем запустите его снова, где run_ID = Max(runID) -1. Сравните две таблицы, покажите различия, которые могут отображаться в столбцах, таких как SELECT AccountBranch WHERE MAX(Run_ID) -1 AS WAS. и т. д. и другой столбец с именем по имени 'IS NOW' и т. д. для каждого столбца.

SELECT AEI_GFXAccounts.AccountNumber,
  AccountBranch,
  AccountName,
  AccountType,
  CostCenter,
  TransactionLimit,
  ClientName,
  DailyCumulativeLimit
FROM AEI_GFXAccounts
JOIN AEI_GFXAccountSTP
  ON (AEI_GFXAccounts.feed_id = AEI_GFXAccountSTP.feed_id
  and AEI_GFXAccounts.run_id = AEI_GFXAccountSTP.run_id)

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Я использую что-то похожее на это, чтобы обнаружить изменения для системы ведения журнала:

WITH data AS (

    SELECT
      a.run_id,
      a.AccountNumber,
      ?.AccountBranch,
      ?.AccountName,
      ?.AccountType,
      ?.CostCenter,
      ?.TransactionLimit,
      ?.ClientName,
      ?.DailyCumulativeLimit
    FROM 
      AEI_GFXAccounts a
      INNER JOIN AEI_GFXAccountSTP b
      ON 
        a.feed_id = b.feed_id and 
        a.run_id = b.run_id
), 
yest AS (
  SELECT * FROM data WHERE run_id = (SELECT MAX(run_id)-1 FROM AEI_GFXAccounts)
),
toda AS (
  SELECT * FROM data WHERE run_id = (SELECT MAX(run_id) FROM AEI_GFXAccounts)
)

SELECT
  CASE WHEN COALESCE(yest.AccountBranch, 'x') <> COALESCE(toda.AccountBranch, 'x') THEN yest.AccountBranch END as yest_AccountBranch,
  CASE WHEN COALESCE(yest.AccountBranch, 'x') <> COALESCE(toda.AccountBranch, 'x') THEN toda.AccountBranch END as toda_AccountBranch,
  CASE WHEN COALESCE(yest.AccountName, 'x')   <> COALESCE(toda.AccountName, 'x')   THEN yest.AccountName   END as yest_AccountName,
  CASE WHEN COALESCE(yest.AccountName, 'x')   <> COALESCE(toda.AccountName, 'x')   THEN toda.AccountName   END as toda_AccountName,

  ...

FROM
  toda INNER JOIN yest ON toda.accountNumber = yestaccountNumber

Примечания:

  • Вы не сказали, из какой таблицы принадлежат некоторые из ваших столбцов,Я поставил им префикс ?. - замените их a. или as. соответственно (всегда хорошая практика для полной квалификации всех псевдонимов столбцов)
  • Когда вы повторяете шаблон в нижней частивыберите (выше ...) выберите данные для COALESCE, которые не будут отображаться в столбце. Я использую COALESCE как быстрый способ избежать необходимости писать CASE WHEN a is null and b is not null or b is null and a is not null or a != b, но сравнение не удается, если вчера имя учетной записи (например) было 'x', а сегодня это значение равно нулю, потому что значение NULL становится 'x'. Если вы выберете данные, которые никогда не появятся в столбце, то проверка сработает, потому что значения NULL будут объединены с тем, что никогда не может появиться в реальных данных, и, следовательно, будет выполнено сравнение <>
  • Есливас не волнует, когда столбец сегодня обнуляется из значения вчера, или вчера был нулем, но является значением сегодня, вы можете отказаться от объединения и буквально просто сделать toda.X <> yest.X
  • Новые счета сегодня выиграны 'покажись до завтра. Если вы хотите, чтобы они появились, сделайте toda LEFT JOIN yest .... Конечно, все их свойства будут отображаться как новые;)
  • Этот запрос возвращает все учетные записи независимо от того, были ли внесены какие-либо изменения. Если вам нужен только список учетных записей с изменениями, вам понадобится предложение where, аналогичное вашему случаю, когда:
    WHERE
      COALESCE(toda.AccountBranch, 'x') <> COALESCE(yest.AccountBranch, 'x') OR      
      COALESCE(toda.AccountName,   'x') <> COALESCE(yest.AccountName,   'x') OR
      ...
0 голосов
/ 22 октября 2019

У вас есть поле даты? Если это так, вы можете использовать Row_Number, разделенный вашими учетными записями. Исключите все учетные записи, которые имеют максимум 1 строку «Новые учетные записи», а затем вычтите Макс. (Число) каждой загрузки учетной записи из-за нагрузки «Макс. также используйте функцию задержки, чтобы получить предыдущую загрузку учетных записей вместо Max (rownumber) -1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...