Как я могу создать список, игнорируя записи с датой, которая не соответствует диапазону, который я ищу? - PullRequest
0 голосов
/ 18 февраля 2019

Я использую Microsoft SQL Server, в настоящее время у меня есть таблица с записями для учетных записей.Эти основные учетные записи могут иметь несколько дополнительных учетных записей, связанных с ними.Например, основная учетная запись XXX может иметь вспомогательную учетную запись XXXA и XXXB и ... XXXN и т. Д. И т. Д.

Эти вспомогательные учетные записи могут быть открыты и добавлены к основной учетной записи XXX по времени, поэтому на разныхмоменты времени.Когда открывается новая вспомогательная учетная запись, она также открывает новую основную учетную запись.С этого момента к этому основному счету могут быть добавлены другие дополнительные учетные записи.

У меня есть столбец с датами открытия счета.Эти даты связаны с открытием субсчетов.

Я пытаюсь создать список основных учетных записей (не дополнительных учетных записей), которые были открыты между 2018-11-01 и 2019-02-15.Однако я хочу включить только новые ОСНОВНЫЕ УЧЕТНЫЕ ЗАПИСИ, поэтому игнорирую все основные учетные записи, которые имеют дату открытия счета до 2018-11-01 гг.

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

Я пытался использовать функцию MIN внутри наличия моих дат.Я также проверил другие потоки переполнения стека для решения

SELECT master_accounts, accountopendate, accountclosedate
FROM accounts
GROUP BY master_accounts, accountopendate, accountclosedate
HAVING MIN(accountopendate) BETWEEN '2018-11-01' AND '2019-02-15';

Это дало мне список основных учетных записей, однако после некоторого контроля качества я нашел несколько основных учетных записей в списке, которые были открытыдо 2018-11-01.

Я хотел бы получить список основных счетов с самой старой датой открытия счета 2018-11-01, игнорируя все основные счета с датами открытия счета до 2018-11-01.

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

+-----------------+-----------------+------------------+
| master_accounts | accountopendate | accountclosedate |
+-----------------+-----------------+------------------+
| XXX             | 2018-11-01      | NULL             |
| ZZZ             | 2018-12-01      | NULL             |
| YYY             | 2019-02-01      | NULL             |
+-----------------+-----------------+------------------+

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

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

Сначала изолируйте номера счетов и начальную дату открытия, затем присоедините этот набор результатов к вашей базовой таблице.Я использовал CTE, но sub-query сделал бы то же самое.

Использование CTE:

WITH masterOpen AS
  (
    SELECT
      master_accounts
     ,MIN(accountopendate) AS openDate
    FROM
      dbo.accounts
    GROUP BY
      master_accounts
  )
SELECT
  a.master_accounts
 ,a.accountopendate
 ,a.accountclosedate
FROM
  dbo.accounts AS a
JOIN
  masterOpen AS mo
    ON
      mo.master_accounts = a.master_accounts
      AND 
      mo.openDate = a.accountopendate
      AND 
      mo.openDate >= '2018-11-01' 
      AND 
      mo.openDate <= '2019-02-15';

Sub-query вместо:

SELECT
  a.master_accounts
 ,a.accountopendate
 ,a.accountclosedate
FROM
  (
    SELECT
      master_accounts
     ,MIN(accountopendate) AS openDate
    FROM
      dbo.accounts
    GROUP BY
      master_accounts
  ) AS mo
JOIN
  dbo.accounts AS a
    ON
      mo.master_accounts = a.master_accounts
      AND 
      mo.openDate = a.accountopendate
      AND 
      mo.openDate >= '2018-11-01' 
      AND 
      mo.openDate <= '2019-02-15';

Параметры даты также можно разбить на предложение WHERE, есливы предпочитаете, но с INNER JOIN это даст те же результаты.Для текущих версий механизма SQL это больше вопрос предпочтений, чем производительности.

0 голосов
/ 18 февраля 2019

Почему бы просто не использовать фильтр

SELECT distinct master_accounts, accountopendate, accountclosedate
FROM accounts where accountopendate>='2018-11-01' AND accountopendate<='2019-02-15'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...