带有 UNION 子查询的 MAX 不会产生所需的结果

Posted

技术标签:

【中文标题】带有 UNION 子查询的 MAX 不会产生所需的结果【英文标题】:MAX with UNION subquery does not produce desired results 【发布时间】:2019-07-29 13:18:16 【问题描述】:

我无法从 UNION 子查询中获取最大日期。我的代码如下所示:

SELECT MX.LOCATION AS LOC, MAX(MX.TIMESTAMP) AS TIME
FROM

  (SELECT TAB1.LOCATION AS LOCATION, TAB2.TIMESTAMP AS TIMESTAMP
   FROM TABLE1 TAB1
   JOIN TABLE2 TAB2 ON TAB1.ID=TAB2.ID
   WHERE TAB2.COMPANY =3

   UNION

   SELECT TAB3.LOCATION AS LOCATION, TAB2.TIMESTAMP AS TIMESTAMP
   FROM TABLE3 TAB3
   WHERE TAB3.COMPANY = 3) MX

GROUP BY MX.LOCATION

当我在由 UNION 连接的两个查询中具有相同的位置时,就会出现问题。 我得到的是第一个查询和第二个查询的 MAX 时间戳。我想要的只是每个位置的 MAX - 不是两个。

样本数据。工会声明的输出。表列仅指示属于的数据集行

LOCATION  TIMESTAMP        TABLE
855       2017-07-29 13:48 TAB1
856       2017-07-28 14:50 TAB1
855       2017-07-29 11:48 TAB2

RESULT
LOCATION  TIMESTAMP
855       2017-07-29 11:48
855       2017-07-29 13:48
856       2017-07-28 14:50

【问题讨论】:

样本数据和期望的结果会有所帮助。 你一定是做错了什么。由于您拥有GROUP BY MX.LOCATION,因此您必须使用其最大时间戳获取每个位置一次。 Group by 子句将删除较低的时间戳,因此您必须仅获取具有最大时间戳的位置。正如@GordonLinoff 建议的那样,请发布一些示例数据和预期结果。 @forpas 理论上是的,这是我第一次使用 UNION 进行聚合,看起来很奇怪。正如我所说,它仅在同一位置位于由 UNION 连接的两个表中时才会发生 如果您在同一位置获得 2 行,则它不是同一位置。检查末尾的空格或任何不可打印的字符。 【参考方案1】:

问题解决了。有些地方有空格。我用TRIM函数解决了。

【讨论】:

【参考方案2】:

查询可以写成如下

with allTableInformation as (

SELECT tb1.location, tb1.time
from table1 tb1

union
select tb2.location, tb2.time
from table2 tb2

union
select tb3.location, tb3.time
from table3 tb3
) 
select distinct on (location) location, time from allTableInformation 
order by location, time desc

您可以尝试在demo查询

【讨论】:

以上是关于带有 UNION 子查询的 MAX 不会产生所需的结果的主要内容,如果未能解决你的问题,请参考以下文章

具有 3 列的 UICollectionView 不会产生所需的结果

soffice 命令:从 html 到 odt 的转换不会产生所需的输出

无法让 SQL Server 子查询选择所需的结果

使用 Left join , Union 和 Right Join 获得所需的结果

优化使用子选择进行分页的一对多查询

带有子查询的 SQL 查询上的 MS Access VBA 运行时错误 3075