oracle - 在Oracle中字段值更改时增加行号

标签 oracle field increment row-number

在Oracle中为以下数据编写查询时,我需要帮助。数据按“人”和“天”字段排序。

    Person     Day   Flag
    ------     ---   ---- 
    person1    day1   Y
    person1    day2   Y
    person1    day3   Y
    person1    day4   N
    person1    day5   N
    person1    day6   Y
    person1    day7   Y
    person1    day8   Y

我需要有一个Group_Number列,每当Flag值更改时,该列都会增加。我的结果应该如下所示
    Person     Day   Flag  Group_Number
    ------     ---   ----  ------------
    person1    day1   Y    1
    person1    day2   Y    1
    person1    day3   Y    1
    person1    day4   N    2
    person1    day5   N    2
    person1    day6   Y    3
    person1    day7   Y    3
    person1    day8   Y    3

我认为可以使用ROW_NUMBER,LEAD等分析功能来获得以上结果。

最佳答案

您可以将analytic functions SUM(用作运行总计)和 LAG 结合使用:

SQL> WITH data AS (
  2            SELECT 'person1' person, 'day1' day, 'Y' flag FROM dual
  3  UNION ALL SELECT 'person1' person, 'day2' day, 'Y' flag FROM dual
  4  UNION ALL SELECT 'person1' person, 'day3' day, 'Y' flag FROM dual
  5  UNION ALL SELECT 'person1' person, 'day4' day, 'N' flag FROM dual
  6  UNION ALL SELECT 'person1' person, 'day5' day, 'N' flag FROM dual
  7  UNION ALL SELECT 'person1' person, 'day6' day, 'Y' flag FROM dual
  8  UNION ALL SELECT 'person1' person, 'day7' day, 'Y' flag FROM dual
  9  UNION ALL SELECT 'person1' person, 'day8' day, 'Y' flag FROM dual
 10  )
 11  SELECT person, DAY, flag, SUM(gap) over (PARTITION BY person
 12                                           ORDER BY DAY) grp
 13    FROM (SELECT person, DAY, flag,
 14                 CASE WHEN flag = lag(flag) over (PARTITION BY person
 15                                                  ORDER BY DAY)
 16                      THEN 0
 17                      ELSE 1
 18                 END gap
 19            FROM DATA);

PERSON  DAY  FLAG        GRP
------- ---- ---- ----------
person1 day1 Y             1
person1 day2 Y             1
person1 day3 Y             1
person1 day4 N             2
person1 day5 N             2
person1 day6 Y             3
person1 day7 Y             3
person1 day8 Y             3

关于oracle - 在Oracle中字段值更改时增加行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16563581/

相关文章:

java - 如何检查我是否从java插入数据库

java - 访问修饰符和隐藏 Java 字段

checkbox - 为 Paypal 创建一个复选框和捐赠字段

java - 将 JTextField 中的整数加一

c - 为什么这些构造使用增量前和增量后未定义的行为?

sql - "union"超过 "group by cube"

mysql - to_number() 的兼容性查询

oracle - 我无法安装 Oracle 12c R2 [20802]

python - 动态添加字段到数据类对象

c++ - 评估顺序和未定义行为