首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在忽略日期不符合所查找范围的记录的情况下生成列表?

如何在忽略日期不符合所查找范围的记录的情况下生成列表?
EN

Stack Overflow用户
提问于 2019-02-18 23:04:56
回答 2查看 43关注 0票数 0

我使用的是Microsoft SQL Server,目前我有一个包含帐户记录的表。这些主帐户可以有多个链接到它们的子帐户。例如,主帐户XXX可以有子帐户XXXA和XXXB,并且...XXXN等等。

这些子账号可以跨时间开立并添加到主账号XXX,因此可以在不同的时间点。当新开通一个子账号时,也会同时开通一个新的主账号。从那时起,可以将其他子帐户添加到该主帐户号。

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

我正在尝试生成2018-11-01到2019-02-15期间开通的主账户(非子账户)的列表。但是,我只想包含新的主账号,因此忽略所有开户日期早于2018-11-01的主账号。

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

我试着在我的约会中使用了MIN函数。我也检查了其他堆栈溢出线程的解决方案

代码语言:javascript
复制
SELECT master_accounts, accountopendate, accountclosedate
FROM accounts
GROUP BY master_accounts, accountopendate, accountclosedate
HAVING MIN(accountopendate) BETWEEN '2018-11-01' AND '2019-02-15';

它给了我一个主账户的列表,但是在做了一些QA之后,我在列表中发现了一些在2018-11-01之前开通的主账户。

我想要一个开户日期最早的主账号列表,忽略所有开户日期早于2018-11-01的主账号。

预期结果:

代码语言:javascript
复制
+-----------------+-----------------+------------------+
| master_accounts | accountopendate | accountclosedate |
+-----------------+-----------------+------------------+
| XXX             | 2018-11-01      | NULL             |
| ZZZ             | 2018-12-01      | NULL             |
| YYY             | 2019-02-01      | NULL             |
+-----------------+-----------------+------------------+
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-19 01:44:56

假设最早的开业日期总是包含主账号,这应该是可行的。

首先,隔离帐号和初始开户日期,然后将结果集连接到您的基表。我使用的是CTE,但sub-query也可以完成同样的任务。

使用CTE

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-02-18 23:36:27

为什么不直接使用过滤器

代码语言:javascript
复制
SELECT distinct master_accounts, accountopendate, accountclosedate
FROM accounts where accountopendate>='2018-11-01' AND accountopendate<='2019-02-15'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54750089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档