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;