Sql 如何在此处选择最大值的不同值

Sql 如何在此处选择最大值的不同值,sql,distinct,Sql,Distinct,我有下面的表A和表B,其中A与B是一对多;对于A的每个记录,我需要为A的每个组在B上选择相应的max记录。 i、 e.根据上次更新的时间进行分组 SELECT taba.ws_name, tabb.b2a, max(tabb.last_update_time) FROM TabA taba, TabB tabb where taba.name = 'xyz' and taba.id = tabb.b2a group by taba.ws_name, tabb.b2a 这很好用 当我需要选

我有下面的表A和表B,其中A与B是一对多;对于A的每个记录,我需要为A的每个组在B上选择相应的max记录。 i、 e.根据上次更新的时间进行分组

SELECT taba.ws_name, tabb.b2a,  max(tabb.last_update_time)
FROM TabA taba, TabB tabb
where taba.name = 'xyz'
and taba.id = tabb.b2a 
group by taba.ws_name, tabb.b2a 
这很好用

当我需要选择上一个事务的状态时,问题就出现了,这导致选择重复的状态,因为状态可以是失败或成功

我的要求是只选择max记录,而不管其状态如何,尽管我也需要显示状态

因此,当任何ws_名称都有多个失败和成功记录时,将为失败和成功两组选择最大更新_时间

下面是我尝试过的查询,但没有得到关于如何删除因状态而选择的重复项的线索

SELECT taba.ws_name, tabb.b2a, **tabb.status**,  max(tabb.last_update_time)
FROM TabA taba, TabB tabb
where taba.name = 'xyz'
and taba.id = tabb.b2a 
group by taba.ws_name, tabb.b2a, **tabb.status**

通常,您需要选择最大值,然后加入到该结果中,以获得所需的实际值

例如:

SELECT     InnerQuery.*,
           TabB.Status

FROM      
            (SELECT     A.ws_name, 
                       B.b2a, 
                       max(B.last_update_time) AS MaxUpdatedTime

            FROM       TabA A
            INNER JOIN TabB B ON (A.id = B.b2a)

            GROUP BY   A.ws_name,
                              B.b2a) AS InnerQuery
INNER JOIN
            TabB ON (InnerQuery.b2a = TabB.b2A AND TabB.last_update_time = InnerQuery.MaxUpdatedTime)
InnerQuery为您提供所需的所有行,但不包括状态。因此,我们重新连接到B以获取匹配行的状态


i、 e.我们得到B中所有我们想要的行,然后再连接回B,以获得我们唯一标识的那些行的状态值,因为正如您所说,引入状态只会给我们提供另一个级别的分组。

您需要有一个嵌套的选择:

SELECT
    X.*, B.status
FROM
    (SELECT
        taba.ws_name,
        tabb.b2a,
        max(tabb.last_update_time) AS maxtime
     FROM
        TabA taba,
        TabB tabb
     where
        taba.name = 'xyz' and taba.id = tabb.b2a
     group by
        taba.ws_name,
        tabb.b2a) X,
    tabb B
WHERE
    X.b2a = B.b2a AND X.maxtime = B.last_update_time
我还将使用join子句。这是连接表格的“现代”方式

SELECT
    X.*, Y.status
FROM
    ( SELECT
          A.ws_name,
          B.b2a,
          max(B.last_update_time) AS maxtime
      FROM
          TabA A
          INNER JOIN TabB B
              ON A.id = B.b2a
      WHERE
          A.name = 'xyz'
      GROUP BY
          A.ws_name,
          B.b2a) X,
    INNER JOIN TabB Y
        ON X.b2a = Y.b2a AND X.maxtime = Y.last_update_time

如果用左连接替换内部连接,当TabA中没有相应的记录时,也会得到TabA中记录的结果。

您可以使用CTE,事实上,在这种情况下,使用此查询和子查询的结果是相同的,但不同之处在于,在我看来,此代码更易于阅读

具有的第一个块执行查询以获取最大值及其对应的ID,并将结果存储在临时表中

然后在第二个查询中,使用第一个CTE查询结果中获得的最大值,并使用它们限制原始查询的结果

WITH TabB_CTE(b2a, last_update_time) as
(
    Select
        b2a, max(last_update_time) As last_update_time
    From
        TabB
    Group By b2a
)

SELECT 
    taba.ws_name, tabb.b2a, tabb.status, tabb.last_update_time
FROM
    TabA taba Join TabB tabb
        On  taba.id = tabb.b2a
    Join TabB_CTE tabc
        On  tabc.b2a = tabb.b2a
        And tabc.last_update_time = tabb.last_update_time
where taba.name = 'xyz'

当我下班回家的那天,我的SQL大脑关闭了,但是仅仅选择而不是按tabb.status分组是否会给你一个错误?@JoachimIsaksson取决于服务器类型。严格的服务器,就像postgres一样,将会爆炸。Lax服务器,如mysql,不会-在mysql的can中,它将返回每个组遇到的第一行。谢谢,我必须在第一个select中添加一个“distinct”,因为“MaxUpdatedTime”有时在少数情况下具有相同的值,因此它在此处根据最大时间返回重复的值。