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)
我有如下回复查询
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) |