带有 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 的转换不会产生所需的输出