【问题标题】:Oracle analytical functionOracle 解析函数
【发布时间】:2015-06-30 11:39:44
【问题描述】:

我也有类似的问题。谁能给我解决方案。 下面是表值

    10    
    20    
    30   
    40

我想要这样的输出

10  10-2     8    
20  20-8    12    
30  30-12   18    
40  40-18   22   

按升序排序,第一个记录总是减去 2,并将结果用于后续记录。

【问题讨论】:

  • 我认为你不能在一个查询中做到这一点。但是生成序列是编程语言非常擅长的。

标签: oracle function analytical


【解决方案1】:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE TEST ( VAL ) AS
          SELECT 10 FROM DUAL
UNION ALL SELECT 20 FROM DUAL
UNION ALL SELECT 30 FROM DUAL
UNION ALL SELECT 40 FROM DUAL;

查询 1

WITH Parities AS (
  SELECT VAL,
         MOD( ROW_NUMBER() OVER ( ORDER BY VAL ), 2 ) AS Parity
  FROM   TEST
)
SELECT VAL,
       ABS( SUM( CASE PARITY WHEN 1 THEN -VAL ELSE VAL END ) OVER ( ORDER BY VAL ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) + 2 ) AS total
FROM   Parities

Results

| VAL | TOTAL |
|-----|-------|
|  10 |     8 |
|  20 |    12 |
|  30 |    18 |
|  40 |    22 |

【讨论】:

  • 优秀、简单、强大的逻辑。非常感谢
  • @Bala - 如果这回答了您的问题,那么您可以将答案标记为正确,以表明问题已关闭。如果没有,那么您可以发布还有其他问题。
  • 我向你脱帽致敬! *{ :-) 这是令人印象深刻的东西!
【解决方案2】:

为了完整性 - 基本的递归解决方案:

SQLFiddle

with t(val, n) as (
  select val, val-2 from test where val = 10
  union all select test.val, test.val-n from test, t where test.val = t.val + 10 )
select * from t

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多