我们如何在不使用联合子句的情况下使用 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 包?

如何在不使用 GROUP BY 子句的情况下获取列值

如何在不使用 GROUP BY 子句的情况下对行进行分组

从工资中选择rownum,其中rownum = 3;

如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?

在不使用联合的情况下获得类似联合的结果