在忽略具有不适合我想要的范围的日期的记录时,我该如何生成列表



我正在使用Microsoft SQL Server,我目前有一个带有帐户记录的表。这些主帐户可以具有链接到它们的几个子帐户。例如,主帐户xxx可以具有子帐户xxxa和xxxb和... xxxn等等。

这些子帐户可以在跨时间开放并添加到主帐户XXX中,因此在不同的时间点。开设新的子帐户时,它还开设了一个新的主帐户。从那时起,可以将其他子帐户添加到该主帐号。

我有一个带有帐户打开日期的列。这些日期链接到子帐户打开时。

我正在尝试生成在2018-11-01和2019-02-15之间开放的主帐户列表(不是子帐户)。但是,我只想包括新的主帐户,因此忽略了在2018-11-01之前具有开放日期的任何主帐户。

我遇到的问题是我生成的列表中显示的主帐户,因为它们在我要寻找的日期范围内已添加给它们的子帐户。

我尝试在日期内使用最小功能。我已经检查了其他堆栈溢出线程以及解决方案

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             |
+-----------------+-----------------+------------------+

这应该有效,假设最早的开放日期始终包含主帐号。

首先,隔离帐号和初始开放日期,然后将结果设置为基础表。我使用了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引擎,它比性能更重要。

为什么不只是使用过滤器

SELECT distinct master_accounts, accountopendate, accountclosedate
FROM accounts where accountopendate>='2018-11-01' AND accountopendate<='2019-02-15'

最新更新