编写一个Oracle SQL查询以获得三个或更多连续的ID,这些ID的雇员数为100.例如,在下面的数据中,我们需要ID为-5、6、7、8的行 说明:ID为5、6、7、8的行是连续的,并且有>100个TOTAL_EMPLOYEE.但是,即使TOTAL_Employees>100也没有 Select id 10或12,因为它们不是连续的.

输入数据数据

create table employee(id integer, enroll_date date, total_employees integer);


insert into employee values (1,to_date('01-04-2023','DD-MM-YYYY'),10);
insert into employee values (2,to_date('02-04-2023','DD-MM-YYYY'),109);
insert into employee values (3,to_date('03-04-2023','DD-MM-YYYY'),150);
insert into employee values (4,to_date('04-04-2023','DD-MM-YYYY'),99);
insert into employee values (5,to_date('05-04-2023','DD-MM-YYYY'),145);
insert into employee values (6,to_date('06-04-2023','DD-MM-YYYY'),1455);
insert into employee values (7,to_date('07-04-2023','DD-MM-YYYY'),199);
insert into employee values (8,to_date('08-04-2023','DD-MM-YYYY'),188);
insert into employee values (10,to_date('10-04-2023','DD-MM-YYYY'),188);
insert into employee values (12,to_date('12-04-2023','DD-MM-YYYY'),10);
insert into employee values (13,to_date('13-04-2023','DD-MM-YYYY'),200);

已try 在下面获取连续的组和员工计数标志,但无法获得所需结果.

select id, enroll_date,total_employees,
        case when total_employees>100 then 1 else 0 end emp_flag,
        SUM(case when total_employees>100 then 1 else 0 end) OVER (ORDER BY id) AS grp,
        id - row_number() over(order by id) as diff, -- group consecutive id's
        ROW_NUMBER() OVER (PARTITION BY CASE WHEN total_employees > 100
                           THEN 1 ELSE 0 END ORDER BY enroll_date) as sal_rn,
        id - ROW_NUMBER() OVER (PARTITION BY CASE WHEN total_employees > 100
                           THEN 1 ELSE 0 END ORDER BY enroll_date) AS sal_grp
from employee
;

推荐答案

这里有一个 Select ;阅读代码中的注释.

SQL> with temp as
  2    -- eliminate rows by number of total employees and create groups (islands)
  3    (select b.*,
  4       row_number() over (order by id) - id grp
  5     from employee b
  6     where total_employees > 100
  7    ),
  8  temp2 as
  9    -- count number of members per group
 10    (select a.*,
 11       count(*) over (partition by grp) cnt
 12     from temp a
 13    )
 14  -- finally, extract rows that have 3 or more consecutive rows in the same group
 15  select id, enroll_date, total_employees
 16  from temp2
 17  where cnt >= 3
 18  order by id;

        ID ENROLL_DAT TOTAL_EMPLOYEES
---------- ---------- ---------------
         5 05-04-2023             145
         6 06-04-2023            1455
         7 07-04-2023             199
         8 08-04-2023             188

SQL>

Sql相关问答推荐

PG SQL中按条件聚合值

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

部分匹配表中元素的MariaDB查询查找结果

在Oracle中,如何删除具有特定值的行,仅当它是重复的行?

如何在PostgreSQL中的一列中添加两个文本?

基于唯一值在Access查询中创建计数器

如何隐藏聚合JSON数组元素的键

TSQL如何为群分配号码

Snowflake 中的分层数据

当 ansible 变量未定义或为空时,跳过 sql.j2 模板中的 DELETE FROM 查询

group by 并根据同表中其他列的某些条件获取 group by 中的某一列值

通过ID和数据找到每个不同的值

计算组内多个日期间隔go 年的累计天数

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

在自引用表中使用分组和计数的SQL查询语句

如何从一张表中获取值在至少三行相同的记录

查询以查找今天和昨天的数据之间的差异以及伪列

为重复的项目编号显示正在处理

将 MERGE 语句与 Oracle PL/SQL 表类型一起使用时,导致无效数据类型错误的原因是什么?

在 UTF 编码字符上应用 SQL LIKE 语句没有给出任何结果