Sql 最大值加上具有联接的其他数据
这应该是一个简单的问题,我想至少在我几个小时前开始做这件事的时候,我还以为会是这样 我试图从一个表中选择最大值,并将其与另一个表连接以获得相关数据 我有两张表:账户和账户余额 这是:Sql 最大值加上具有联接的其他数据,sql,sql-server,Sql,Sql Server,这应该是一个简单的问题,我想至少在我几个小时前开始做这件事的时候,我还以为会是这样 我试图从一个表中选择最大值,并将其与另一个表连接以获得相关数据 我有两张表:账户和账户余额 这是: ACCOUNTS ACC_ID | NAME | IMG_LOCATION ------------------------------------ 0 | Cash | images/cash.png 500 | MyBank | images/mybank.png 及
ACCOUNTS
ACC_ID | NAME | IMG_LOCATION
------------------------------------
0 | Cash | images/cash.png
500 | MyBank | images/mybank.png
及
我希望最终结果如下所示:
ACC_ID | NAME | IMG_LOCATION | BALANCE | UPDATE_DATE
----------------------------------------------------------------
0 | Cash | images/cash.png | 100 | 2018-01-05
500 | MyBank | images/mybank.png | 250 | 2018-01-11
我想我可以从ACCOUNT_BALANCES表中选择MAXUPDATE_DATE,并与ACCOUNTS表连接以获得如上所示的帐户名称,但必须通过方式进行分组我的最终结果包括ACCOUNT_BALANCES表中的所有记录
我可以使用此查询仅选择帐户余额中具有最大更新日期的记录,但不能包括余额
SELECT
a.ACC_ID,
a.IMG_LOCATION,
a.NAME,
x.UDATE
FROM
ACCOUNTS a
RIGHT JOIN
(
SELECT
b.ACC_ID,
MAX(b.UPDATE_DATE) as UDATE
FROM
ACCOUNT_BALANCES b
GROUP BY
b.ACC_ID
) x
ON
a.ACC_ID = x.ACC_ID
如果我在上述查询中包括ACCOUNT_BALANCES.BALANCE,如下所示:
SELECT
a.ACC_ID,
a.IMG_LOCATION,
a.NAME,
x.UDATE
FROM
ACCOUNTS a
RIGHT JOIN
(
SELECT
b.ACC_ID,
b.BALANCE,
MAX(b.UPDATE_DATE) as UDATE
FROM
ACCOUNT_BALANCES b
GROUP BY
b.ACC_ID, b.BALANCE
) x
ON
a.ACC_ID = x.ACC_ID
返回的结果如下所示:
ACC_ID | NAME | IMG_LOCATION | BALANCE | UPDATE_DATE
----------------------------------------------------------------
0 | Cash | images/cash.png | 100 | 2018-01-05
500 | MyBank | images/mybank.png | 100 | 2018-01-11
500 | MyBank | images/mybank.png | 250 | 2018-01-11
这显然是事实,因为我在子查询中按平衡分组
我非常犹豫是否要发布这篇文章,因为这类问题似乎已经被回答了n次,但我已经搜索了很多次,但没有找到任何真正对我有帮助的
很明显,我遗漏了一些非常简单的东西,即使是指向正确方向的指针也会有所帮助。谢谢。试试这个
;WITH CTE
AS
(
SELECT
RN = ROW_NUMBER() OVER(PARTITION BY AC.ACC_ID ORDER BY AB.UPDATE_DATE DESC),
AC.ACC_ID,
NAME,
IMG_LOCATION,
BALANCE,
UPDATE_DATE
FROM ACCOUNTS AC
INNER JOIN ACCOUNT_BALANCES AB
ON AC.ACC_ID = AB.ACC_ID
)
SELECT
*
FROM CTE
WHERE RN = 1
被接受的答案将起作用。但是,对于大型数据集,请尽量避免使用row_number函数。相反,假设更新日期是唯一约束的一部分,您可以尝试如下操作:
SELECT
a.Acc_Id,
a.Name,
a.Img_Location,
bDetail.Balance,
bDetail.Update_Date
FROM
@accounts AS a LEFT JOIN
(
SELECT Acc_Id, MAX(Update_Date) AS Update_Date
FROM @account_balances AS b
GROUP BY Acc_Id
) AS maxDate ON a.Acc_Id = maxDate.Acc_Id
LEFT JOIN @account_balances AS bDetail ON maxDate.Acc_Id = bDetail.Acc_Id AND
maxDate.Update_Date = bDetail.Update_Date
我认为最简单的方法是:
apply实现技术上称为横向连接的功能。这是一种非常强大的连接类型—类似于相关子查询的泛化。是的!很好,谢谢你,我的朋友!我想我现在将研究分区,谢谢您的帮助:
SELECT
a.Acc_Id,
a.Name,
a.Img_Location,
bDetail.Balance,
bDetail.Update_Date
FROM
@accounts AS a LEFT JOIN
(
SELECT Acc_Id, MAX(Update_Date) AS Update_Date
FROM @account_balances AS b
GROUP BY Acc_Id
) AS maxDate ON a.Acc_Id = maxDate.Acc_Id
LEFT JOIN @account_balances AS bDetail ON maxDate.Acc_Id = bDetail.Acc_Id AND
maxDate.Update_Date = bDetail.Update_Date
select a.*, ab.*
from accounts a outer apply
(select top 1 ab.*
from account_balances ab
where ab.acc_id = a.acc_id
order by ab.update_date desc
) ab;