【问题标题】:Is there any way in Oracle to skip a value in a select when it has been already shown?Oracle 中是否有任何方法可以在选择中跳过已经显示的值?
【发布时间】:2021-11-29 19:09:15
【问题描述】:

很抱歉,因为这可能是一个愚蠢的问题,但老实说,我不知道如何处理它。假设在执行带有group by 子句的select 后,我有以下信息:

col1    col2    col3
---------------------
value1  optionA  1
value1  optionB  5
value2  optionA  3
value2  optionB  4

但我想获得以下内容:

col1    col2    col3
---------------------
value1  optionA  1
        optionB  5
value2  optionA  3
        optionB  4

换句话说,如果之前显示的值相同(在本例中为 value1 和 value2),我不想显示之前显示的值

这对 Oracle 可行吗?如果答案是肯定的,请您指出正确的方向吗?

谢谢。

【问题讨论】:

  • 可以,但您需要告诉我们订购标准是什么。
  • 虽然您可以在纯 SQL 中执行此操作(如 @TheImpaler 所示,+1),但在纯 SQL 中执行此操作通常有点可疑。无论您必须向人类用户显示结果的任何工具都可能具有格式化结果的选项。这就是通常在用户界面层中比在 SQL 中更合适的事情(如果只是因为当有人想要更改数据显示方式而不需要使用 SQL 时,UI 人员可以稍后对其进行调整) )。

标签: sql oracle select


【解决方案1】:

如果您在 SQL*Plus 上使用不支持分析功能的 Oracle 版本,您可以使用它的 break 命令。我想现在不是这样吧?

原来:

SQL> with temp (col1, col2, col3) as
  2    (select 'value1', 'optionA', 1 from dual union all
  3     select 'value1', 'optionB', 5 from dual union all
  4     select 'value2', 'optionA', 3 from dual union all
  5     select 'value2', 'optionB', 4 from dual
  6    )
  7  select col1, col2, col3
  8  from temp
  9  order by col1, col2;

COL1   COL2          COL3
------ ------- ----------
value1 optionA          1
value1 optionB          5
value2 optionA          3
value2 optionB          4

让我们打破它:

SQL> break on col1
SQL>
SQL> /

COL1   COL2          COL3
------ ------- ----------
value1 optionA          1
       optionB          5
value2 optionA          3
       optionB          4

SQL>

【讨论】:

    【解决方案2】:

    你没有说行的排序标准是什么,所以我假设它是(col1col2)。

    你想要的查询应该是这样的:

    select
      case when col1 = lag(col1) over(order by col1, col2) 
           then null
           else col1
      end as col1,
      col2, 
      col3
    from t
    

    【讨论】:

    • 对不起,我没有提到,但你是绝对正确的。排序标准是 col1 和 col2。我会试一试,谢谢你的帮助。非常感谢。
    • 它有效。我不知道 LAG 和 LEAD 函数,它们显然开辟了新的视野。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多