【问题标题】:How can I print the first three rows and the last three rows one under another in ORACLE SQL?如何在 ORACLE SQL 中打印前三行和后三行?
【发布时间】:2021-03-05 12:07:34
【问题描述】:

在 ORACLE SQL 中,我想将前两行和后两行打印在另一行之下。我怎样才能用一个查询来做到这一点?假设您有十行的表。我想打印前两行和最后两行如下:

Row Number Values
1 A
2 B
9 C
10 D

【问题讨论】:

  • 前三行什么?请记住,表格代表无序(多)集。没有表格的前三行。
  • 请添加几行样本数据和预期的结果。
  • 什么是打印DBMS_OUTPUT.PUT 还是只是 SQL 结果集?
  • 只是 SQL 结果集。

标签: sql oracle


【解决方案1】:

您可以使用 row_number()over(order by row_number) 窗口函数来实现您要查找的内容。如果你愿意,即使你可以让前两行按 row_number 排序,最后两行按列值排序 (row_number()over(order by row_number)FirstRowNumber, row_number()over(order by valuess desc)LastRowNumber ))。

表结构和插入语句:

create table tableName (Row_Number int, Valuess varchar(20));
insert into tablename values(1,'A');
insert into tablename values(2,'B');
insert into tablename values(9,'C');
insert into tablename values(10,'D');
insert into tablename values(11,'E');
insert into tablename values(12,'F');

查询:

SELECT ROW_NUMBER,Valuess FROM (
select ROW_NUMBER,Valuess,row_number()over(order by row_number)FirstRowNumber, row_number()over(order by row_number desc)LastRowNumber from tablename ) T
WHERE FIRSTROWNUMBER<=2 OR LASTROWNUMBER<=2
ORDER BY FIRSTROWNUMBER

输出:

ROW_NUMBER VALUESS
1 A
2 B
11 E
12 F

【讨论】:

    【解决方案2】:

    我认为您需要以下查询,

    select t.*
    from (select table1.*, row_number() over (order by [Row Number]) as seqnum,
                 count(*) over () as cnt
          from table1
         ) t
    where seqnum in( 1,2) or seqnum in( cnt, cnt-1);
    

    【讨论】:

    • t.* 和 table1.* 是什么?
    • table1 是您的数据库表名。 t 是我的子查询盟友名称。而 * 表示选择表格的所有列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多