我们如何在不使用联合子句的情况下使用 rownum 显示给定表的第一行和最后一行
Posted
技术标签:
【中文标题】我们如何在不使用联合子句的情况下使用 rownum 显示给定表的第一行和最后一行【英文标题】:How can we display first row and last row of given table using rownum without using union clause 【发布时间】:2021-04-16 09:50:48 【问题描述】:示例输入
Name | Value | Timestamp
-----|-------|-----------------
One | 1 | 2016-01-01 02:00
Two | 3 | 2016-01-01 03:00
One | 2 | 2016-01-02 02:00
Two | 4 | 2016-01-03 04:00
期望的输出
Name | Value | EarliestTimestamp | LatestTimestamp |
---|---|---|---|
One | 2 | 2016-01-01 02:00 | 2016-01-02 02:00 |
Two | 4 | 2016-01-01 03:00 | 2016-01-03 04:00 |
不使用 union 子句来显示第一行和最后一行。我们如何显示它?
SELECT * FROM TABLE
WHERE ROWNUM = 1
UNION ALL
SELECT * FROM TABLE
WHERE ROWNUM IN (SELECT MAX(ROWNUM) FROM TABLE);
请让我解决这个问题。提前致谢。
【问题讨论】:
不清楚你到底想要什么,“期望的输出”还是你的UNION ALL
的输出?他们是不同的
@Serg - 这应该很明显(因为 union all
查询通常只会产生一行;如果表有 >= 2 行,则第二个查询不会产生任何结果,它会重复单行如果表格只有一行,则为表格的行)。
您希望每个名称分别得到结果吗?还是整个表只有两行(无论“名称”如何)?
【参考方案1】:
您似乎在描述聚合:
select name, max(value), min(timestamp), max(timestamp)
from t
group by name;
您的问题表明您可能需要最新值而不是最大值。如果是这样,请使用first
聚合函数:
select name,
max(value) keep (dense_rank first order by timestamp desc),
min(timestamp), max(timestamp)
from t
group by name;
first
的文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/FIRST.html#GUID-85AB9246-0E0A-44A1-A7E6-4E57502E9238
【讨论】:
复合聚合max(...) keep (dense_rank first/last....)
的技术名称不是keep。相反,它是 first / last 聚合函数。见docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/…
另外,只是好奇 - 为什么 first
聚合函数,时间戳排序 desc
,而不仅仅是 last
函数?以上是关于我们如何在不使用联合子句的情况下使用 rownum 显示给定表的第一行和最后一行的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 DESCRIBE 子句的情况下描述 ORACLE 包?