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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何生成列表而忽略日期不符合我要查找的范围的记录?相关的知识,希望对你有一定的参考价值。

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

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

我有一个帐户开立日期列。这些日期与子帐户的打开时间相关联。

我正在尝试生成2018-11-01和2019-02-15之间打开的主帐户列表(不是子帐户)。但是,我只想包含新的MASTER ACCOUNTS,因此忽略任何在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             |
+-----------------+-----------------+------------------+
答案

这应该有效,假设最早的开放日期总是包括主帐号。

首先,隔离帐号和初始打开日期,然后将该结果集连接到基表。我使用了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'

以上是关于如何生成列表而忽略日期不符合我要查找的范围的记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在实体框架中查找具有指定日期范围列表的日期?

如何从日期范围查询中查找表中的一组缺失日期

从 Postgres 中的非结束日期范围列表中查找未覆盖的日期范围

根据日期范围查找记录

MySQL:查找日期范围之间的缺失日期

mysql日期范围查找(两个日期之间的记录)