Sql 如何在此处选择最大值的不同值
我有下面的表A和表B,其中A与B是一对多;对于A的每个记录,我需要为A的每个组在B上选择相应的max记录。 i、 e.根据上次更新的时间进行分组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 这很好用 当我需要选
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”有时在少数情况下具有相同的值,因此它在此处根据最大时间返回重复的值。