我正在使用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 |
+-----------------+-----------------+------------------+
答案 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'