sql - SQL 从两个表中选择不同的记录
问题描述
我正在尝试编写一个 SQL 语句,该语句将根据最近的 SaleDate 从另一个表中返回一组不同的 CompanyNames,其中包含另一个表的指定日期范围。T01 = 帐户 T02 = TransHeader
重要的字段是:T01.ID、T01.CompanyName T02.AccountID、T02.SaleDate
T01.ID = T02.AccountID
我要返回的是每个 CompanyName 的 Max SaleDate,没有任何重复的 CompanyName,只有 Max(SaleDate) 作为 LastSale。我将使用 Where 子句来限制 SaleDate 范围。
我尝试了以下操作,但它返回了该范围内所有 SalesDates 的所有记录。这导致同一家公司被多次上市。
当前的 MS-SQL 查询
SELECT T01.CompanyName, T02.LastSale
FROM
(SELECT DISTINCT ID, IsActive, ClassTypeID, CompanyName FROM Account) T01
FULL OUTER JOIN
(SELECT DISTINCT AccountID, TransactionType, MAX(SaleDate) LastSale FROM TransHeader group by AccountID, TransactionType, SaleDate) T02
ON T01.ID = T02.AccountID
WHERE ( ( T01.IsActive = 1 )AND
( (Select Max(SaleDate)From TransHeader Where AccountID = T01.ID AND TransactionType in (1,6) AND SaleDate is NOT NULL)
BETWEEN '01/01/2016' AND '12/31/2018 23:59:00' AND (Select Max(SaleDate)From TransHeader Where AccountID = T01.ID AND TransactionType in (1,6) AND SaleDate is NOT NULL) IS NOT NULL
)
)
ORDER BY T01.CompanyName
我认为 FULL OUTER JOIN 是票,但它没有用,我被卡住了。
样本数据科目表(T01)
ID CompanyName IsActive ClassTypeID
1 ABC123 1 1
2 CDE456 1 1
3 EFG789 1 1
4 Test123 0 1
5 Test456 1 1
6 Test789 0 1
示例数据转头表 (T02)
AccountID TransactionType SaleDate
1 1 02/03/2012
2 1 03/04/2013
3 1 04/05/2014
4 1 05/06/2014
5 1 06/07/2014
6 1 07/08/2015
1 1 08/09/2016
1 1 01/15/2016
2 1 03/20/2017
2 1 03/21/2017
3 1 03/04/2017
3 1 04/05/2018
3 1 05/27/2018
4 1 06/01/2018
5 1 07/08/2018
5 1 08/01/2018
5 1 10/11/2018
6 1 11/30/2018
期望的结果
CompanyName LastSale (Notes note returned in the result)
ABC123 01/15/2016 (Max(SaleDate) LastSale for ID=1)
CDE456 03/21/2017 (Max(SaleDate) LastSale for ID=2)
EFG789 05/27/2018 (Max(SaleDate) LastSale for ID=3)
Testing456 10/11/2018 (Max(SaleDate) LastSale for ID=5)
ID=4 & ID=6 are note returned because IsActive = 0 for these records.
解决方案
一种选择是在 select 子句中选择最大日期。
select
a.*,
(
select max(th.saledate)
from transheader th
where th.accountid = a.id
and th.saledate >= '2016-01-01'
and th.saledate < '2019-01-01'
) as max_date
from account a
where a.isactive = 1
order by a.id;
如果您只想在给定日期范围内显示具有销售日期的交易标题,那么您可以将最大日期与帐户进行内部连接。为此,您必须对每个帐户的日期聚合进行分组:
select a.*, th.max_date
from account a
join
(
select accountid, max(saledate) as max_date
from transheader
and saledate >= '2016-01-01'
and saledate < '2019-01-01'
group by accountid
) th on th.accountid = a.id
where a.isactive = 1
order by a.id;
推荐阅读
- python - emcee EnsembleSampler 对象没有属性 get_chain
- r - ggplot 只打印最后一张图
- unity3d - 无法检测与儿童和地面的碰撞
- javascript - 为什么 JavaScript fetch 函数返回错误的值?
- php - Laravel Validation Array 必须包含一个 boolean 为 true 的项目
- azure-pipelines - Azure 管道模板 - 选择要运行的阶段
- javascript - svelte + rollup 中的环境变量
- php - ACF 未在 wp 主题的页脚中显示值
- vue.js - 如何从另一个数据属性访问 Vuejs 数据属性?
- bash - 命令在 docker 中手动成功,但不是通过 bash 脚本