【问题标题】:Oracle SQL assign consecutive numbers to a subset based on column valuesOracle SQL 根据列值将连续数字分配给子集
【发布时间】:2012-08-01 17:00:35
【问题描述】:

我在表上有以下数据

ID_1 ID_2 序列组 212648 601327 1 212648 1805 2 212648 500886 3 212648 3405 4 212648 501174 5 212648 201245 6 212648 500449 7 212648 3804 8 212648 501533 9 212648 3989 10 212648 500280 11 开始 212648 175 12 之间 212648 500395 13 完 212648 1817 14 212648 500945 15 开始 212648 183 16 之间 212648 500543 17 之间 212648 181 18 之间 212648 500009 19 完 212648 5576 20 212648 500960 21 212648 5562 22 212648 603659 23

我想添加一个列,该列将为“START”和“END”之间的行应用组名。 例如:

ID_1 ID_2 SEQ 组 GROUP_SEQ 212648 601327 1 212648 1805 2 212648 500886 3 212648 3405 4 212648 501174 5 212648 201245 6 212648 500449 7 212648 3804 8 212648 501533 9 212648 3989 10 212648 500280 11 开始 1 212648 175 12 1 之间 212648 500395 13 结束 1 212648 1817 14 212648 500945 15 开始 2 212648 183 16 2之间 212648 500543 17 2 之间 212648 181 18 2之间 212648 500009 19 结束 2 212648 5576 20 212648 500960 21 212648 5562 22 212648 603659 23

我搜索了 Oracle 的分析函数(RANK()、FIRST、LAST() 等),但找不到解决方案。 提前感谢您的任何回复。

【问题讨论】:

  • 如果我错了,请纠正我,但你不能规范化表格并避免这种情况吗?
  • SEQ 和 GROUP 列值是来自子选择的计算值。我减小了表格的大小以提出问题。你在考虑什么标准化?
  • 第二范式表明所有非键列在功能上都依赖于整个主键。

标签: sql oracle aggregate-functions


【解决方案1】:

最重要的是,这个查询得到了结果。如果花更多的时间,可能是一种更清洁的方法。

SELECT id_1, id_2, seq, the_group

      ,CASE WHEN (start_count - end_count) > 0 OR (start_count = end_count AND the_group = 'END')
            THEN start_count
            ELSE NULL
       END AS group_seq

  FROM ( SELECT id_1, id_2, seq, the_group

               ,SUM( CASE WHEN the_group = 'START' THEN 1 ELSE 0 END )
                  OVER( PARTITION BY ID_1 ORDER BY id_1, SEQ ) AS start_count

               ,SUM( CASE WHEN the_group = 'END' THEN 1 ELSE 0 END )
                  OVER( PARTITION BY ID_1 ORDER BY id_1, SEQ ) AS end_count

           FROM myTable )

  ORDER BY id_1, seq

【讨论】:

  • 上述查询解决了问题,似乎没有性能问题。很不错的把戏。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多