oracle 如何创建一个列,当其他列中的值与前一行中的值不同时,该列将递增?

eqoofvh9  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(106)

我有一个看法:

  1. col1
  2. aaa
  3. aaa
  4. ccc
  5. ddd

如何添加在值更改时计数的列?
示例:

  1. col1 value_change_counter
  2. aaa 1
  3. aaa 1
  4. ccc 2
  5. ddd 3

另一种情况更复杂。我不确定这是否可能。我想在col1改变时计数,但在col2改变时重置计数器
示例:

  1. col1 col2 value_change_counter
  2. aaa ttt 1
  3. aaa ttt 1
  4. bbb ttt 2
  5. ccc yyy 1
  6. ddd uuu 1
  7. eee uuu 2
  8. fff uuu 3
5cnsuln7

5cnsuln71#

使用DENSE_RANK解析函数:

  1. SELECT t.*,
  2. DENSE_RANK() OVER (PARTITION BY col2 ORDER BY col1) AS value_change_counter
  3. FROM table_name t

其中,对于示例数据:

  1. CREATE TABLE table_name (col1, col2) AS
  2. SELECT 'aaa', 'ttt' FROM DUAL UNION ALL
  3. SELECT 'aaa', 'ttt' FROM DUAL UNION ALL
  4. SELECT 'bbb', 'ttt' FROM DUAL UNION ALL
  5. SELECT 'ccc', 'yyy' FROM DUAL UNION ALL
  6. SELECT 'ddd', 'uuu' FROM DUAL UNION ALL
  7. SELECT 'eee', 'uuu' FROM DUAL UNION ALL
  8. SELECT 'fff', 'uuu' FROM DUAL;

输出:
| COL1| COL 2系统|值_更改_计数器|
| - -|- -|- -|
| 美国汽车协会|TTT技术|一个|
| 美国汽车协会|TTT技术|一个|
| bbb型|TTT技术|2个|
| ddd的|乌乌|一个|
| 电子设备|乌乌|2个|
| fff函数|乌乌|三个|
| ccc格式|年|一个|
fiddle

展开查看全部
mwngjboj

mwngjboj2#

在SQL中,结果集具有不确定的顺序(它们是无序的),因此您不能依赖于行的任何特定顺序,您需要一个单独的列来为这些行指定特定顺序(如果它不对应于按col1和/或col2的字母顺序排序)。
如果有这样的列,例如:

  1. CREATE TABLE table_name (id, col1, col2) AS
  2. SELECT 1, 'aaa', 'ttt' FROM DUAL UNION ALL
  3. SELECT 2, 'aaa', 'ttt' FROM DUAL UNION ALL
  4. SELECT 3, 'bbb', 'ttt' FROM DUAL UNION ALL
  5. SELECT 4, 'ccc', 'yyy' FROM DUAL UNION ALL
  6. SELECT 5, 'ddd', 'uuu' FROM DUAL UNION ALL
  7. SELECT 6, 'eee', 'uuu' FROM DUAL UNION ALL
  8. SELECT 7, 'fff', 'uuu' FROM DUAL UNION ALL
  9. SELECT 8, 'fff', 'ttt' FROM DUAL UNION ALL
  10. SELECT 9, 'ggg', 'ttt' FROM DUAL UNION ALL
  11. SELECT 10, 'fff', 'uuu' FROM DUAL;

然后,在Oracle 12中,您可以使用MATCH_RECOGNIZE执行逐行处理并生成col2分区,然后使用第二次传递为col1生成每个分区内的排序:

  1. SELECT id, col1, col2, value_change_counter
  2. FROM (
  3. SELECT *
  4. FROM table_name
  5. MATCH_RECOGNIZE(
  6. ORDER BY id
  7. MEASURES
  8. MATCH_NUMBER() AS mno
  9. ALL ROWS PER MATCH
  10. PATTERN (same_col2+)
  11. DEFINE
  12. same_col2 AS col2 = FIRST(col2)
  13. )
  14. )
  15. MATCH_RECOGNIZE(
  16. PARTITION BY mno
  17. ORDER BY id
  18. MEASURES
  19. MATCH_NUMBER() AS value_change_counter
  20. ALL ROWS PER MATCH
  21. PATTERN (same_col1+)
  22. DEFINE
  23. same_col1 AS col1 = FIRST(col1)
  24. )

输出:
| 识别码|COL1| COL 2系统|值_更改_计数器|
| - -|- -|- -|- -|
| 一个|美国汽车协会|TTT技术|一个|
| 2个|美国汽车协会|TTT技术|一个|
| 三个|bbb型|TTT技术|2个|
| 四个|ccc格式|年|一个|
| 五个|ddd的|乌乌|一个|
| 六个|电子设备|乌乌|2个|
| 七个|fff函数|乌乌|三个|
| 八个|fff函数|TTT技术|一个|
| 九个|GGG型|TTT技术|2个|
| 10个|fff函数|乌乌|一个|
fiddle

展开查看全部

相关问题