Window 基于列值转换的函数

Window function based on transition of a column value

我有如下回复查询

dest emp
893106 0
717205 1
888305 0
312301 1
645100 0
222001 0
761104 1

我想要 window 函数来分隔行,如下所示:

dest emp
893106 0
717205 1
dest emp
888305 0
312301 1
dest emp
645100 0
222001 0
761104 1

所以每个 window 必须以 emp value = 0 开始并以 emp value = 1 结束。它有检测列值的转换。

响应查询将按某个字段排序,该字段维护结果集中给定的顺序,以便查询正常工作。

您将在当前值为 0 且先前值为 1 的数据中查找模式,并启动一个新的 grp,如下所示。

这是一种方法。

create table t(id int, dest int, emp int);

insert into t 
select 1,893106,0 union all
select 2,717205,1 union all
select 3,888305,0 union all
select 4,312301,1 union all
select 5,645100,0 union all
select 6,222001,0 union all
select 7,761104,1;

commit;

with main_data
as (
select *,case when emp=0 and lag(emp) over(order by id)=1 then
                   1
                   else 0
         end as grp_val
  from t
    )
select *,sum(grp_val) over(order by id) as grp
  from main_data;

+====+========+=====+=========+=====+
| id | dest   | emp | grp_val | grp |
+====+========+=====+=========+=====+
| 1  | 893106 | 0   | 0       | 0   |
+----+--------+-----+---------+-----+
| 2  | 717205 | 1   | 0       | 0   |
+----+--------+-----+---------+-----+
| 3  | 888305 | 0   | 1       | 1   |
+----+--------+-----+---------+-----+
| 4  | 312301 | 1   | 0       | 1   |
+----+--------+-----+---------+-----+
| 5  | 645100 | 0   | 1       | 2   |
+----+--------+-----+---------+-----+
| 6  | 222001 | 0   | 0       | 2   |
+----+--------+-----+---------+-----+
| 7  | 761104 | 1   | 0       | 2   |
+----+--------+-----+---------+-----+

https://sqlize.online/sql/psql14/053971a469e423ef65d97984f9017fbf/

对于这种数据按某个字段排序的场景,每当上一条记录的emp值为1时,就创建一个新组,SQL中实现过程比较复杂。您需要先创建行号,然后根据需要创建标记列,然后根据标记列和行号进行分组。一种常见的替代方法是从数据库中提取原始数据并在 Python 或 SPL 中对其进行处理。 SPL,open-source Java 包,更容易集成到 Java 程序中并生成更简单的代码。它只用两行代码进行计算:

A
1 =PG.query("select dest,emp from t3 order by sth")
2 =A1.group@i(emp[-1]==1)