Sql 从两个表的结果集中返回最近的结果

Sql 从两个表的结果集中返回最近的结果,sql,union,aggregate-functions,Sql,Union,Aggregate Functions,我有一个查询,它从两个表中搜索最近的事务。查询工作正常,返回2个结果 但是根据要求,我还是要把它剪下来,换一个最近的。因此,查询应该只返回1个结果 我已经阅读了聚合函数,并尝试使用MAX和GROUP BY函数,如下所示: SELECT MAX(reserve_date) FROM (SELECT ROW_NUMBER() over (partition BY lower(tb1.email) order by tb1.reserve_date DESC) AS ranking, tb

我有一个查询,它从两个表中搜索最近的事务。查询工作正常,返回2个结果

但是根据要求,我还是要把它剪下来,换一个最近的。因此,查询应该只返回1个结果

我已经阅读了聚合函数,并尝试使用MAX和GROUP BY函数,如下所示:

SELECT MAX(reserve_date)
FROM
  (SELECT ROW_NUMBER() over (partition BY lower(tb1.email) order by tb1.reserve_date DESC) AS ranking,
    tb1.id,
    tb1.reserve_date
  FROM TableTester1 tb1
  UNION
  SELECT ROW_NUMBER() over (partition BY lower(tb2.email) order by tb2.reserve_date DESC) AS ranking,
    tb2.id,
    tb2.reserve_date
  FROM TableTester2 tb2
  )
WHERE ranking = 1;
但这只会导致ORA-00979:而不是GROUP BY表达式错误


关于如何解决此问题,您有什么建议吗?

为什么不仅限于前两项:

SELECT id, reserve_date
FROM
(
    SELECT
        ROW_NUMBER() OVER (PARTITION BY LOWER(tb1.email)
            ORDER BY reserve_date DESC) AS rn,
        id,
        reserve_date
    FROM TableTester1
) t
WHERE rn <= 2;
如果您实际上是指与前两个按秩对应的所有记录,则可以使用秩或密秩替换行编号,具体取决于您要使用哪一个。

使用以下方法:

 SELECT * FROM
 (SELECT ROW_NUMBER() over (partition BY lower(tb.email) order by tb.reserve_date DESC) AS ranking,
tb1.id,
tb1.reserve_date from 
(select * FROM TableTester1 tb1

UNION

select *  FROM TableTester2 tb2
)tb)B
WHERE ranking = 1;
请在union all之后输入行号:


使用行号合并两个查询是不寻常的,您应该解释为什么要这样做。
 SELECT * FROM
 (SELECT ROW_NUMBER() over (partition BY lower(tb.email) order by tb.reserve_date DESC) AS ranking,
tb1.id,
tb1.reserve_date from 
(select * FROM TableTester1 tb1

UNION

select *  FROM TableTester2 tb2
)tb)B
WHERE ranking = 1;
SELECT tt.*
FROM (SELECT tt.*, ROW_NUMBER() OVER (ORDER BY reserve_date DESC) as seqnm
      FROM ((SELECT tb1.id, tb1.reserve_date
             FROM TableTester1 tb1
            ) UNION ALL
            (SELECT tb2.id, tb2.reserve_date
             FROM TableTester2 tb2
            )
           ) tt
     ) tt
WHERE seqnum = 1;