在忽略日期不符合我要查找的范围的记录时,如何生成列表?

时间:2019-02-18 15:04:56

标签: sql sql-server tsql ssms

我正在使用Microsoft SQL Server,目前有一个带有帐户记录的表。这些主帐户可以有几个子帐户链接到它们。例如,主帐户XXX可以具有子帐户XXXA和XXXB以及... XXXN,依此类推。

可以在不同时间打开这些子帐户并将其添加到主帐户XXX中。当打开一个新的子帐户时,它也会同时打开一个新的主帐户。从那时起,可以将其他子帐户添加到该主帐户号。

我有一栏列出了开户日期。这些日期与子帐户的开立时间相关。

我正在尝试生成在2018-11-01至2019-02-15之间打开的主账户(而非子账户)列表。但是,我只想添加新的MASTER ACCOUNTS,因此忽略了任何具有2018年11月1日之前的开户日期的Master帐户。

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

我尝试在约会中使用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 :(得分:1)

这应该可以工作,假设最早的开设日期总是要包含主帐号。

首先,隔离帐号和初始开设日期,然后将结果集加入基表。我使用了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引擎,与其说是性能,不如说是偏好问题。

答案 1 :(得分:0)

为什么不只使用过滤器

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