SQL-分区的笛卡尔积
有一个非常复杂的问题,我无法独自思考。在查询的表中有5列:SQL-分区的笛卡尔积,sql,postgresql,inner-join,graph-theory,recursive-query,Sql,Postgresql,Inner Join,Graph Theory,Recursive Query,有一个非常复杂的问题,我无法独自思考。在查询的表中有5列:PK_ID,它是值的唯一标识符,ID,它连接一个组中的聚合值,计数,表示应该聚合多少个值组(如果没有足够的数据,则应从查询结果中删除具有此类ID的组),num,表示组内聚合值的数量,以及要聚合的值 (Table T1) PK_ID | ID | num | count | value ------+-------+-------+--------+-------- 1 | 1 | 1 | 3
PK_ID
,它是值的唯一标识符,ID
,它连接一个组中的聚合值,计数
,表示应该聚合多少个值组(如果没有足够的数据,则应从查询结果中删除具有此类ID
的组),num
,表示组内聚合值的数量,以及要聚合的值
(Table T1)
PK_ID | ID | num | count | value
------+-------+-------+--------+--------
1 | 1 | 1 | 3 | A
------+-------+-------+--------+--------
2 | 1 | 2 | 3 | B
------+-------+-------+--------+--------
3 | 1 | 3 | 3 | C
------+-------+-------+--------+--------
4 | 1 | 1 | 3 | D
------+-------+-------+--------+--------
5 | 1 | 3 | 3 | E
------+-------+-------+--------+--------
6 | 1 | 2 | 3 | F
------+-------+-------+--------+--------
7 | 1 | 3 | 3 | G
------+-------+-------+--------+--------
8 | 2 | 1 | 2 | H
------+-------+-------+--------+--------
9 | 2 | 2 | 2 | I
------+-------+-------+--------+--------
10 | 2 | 1 | 2 | J
------+-------+-------+--------+--------
11 | 3 | 1 | 5 | X
这种查询的结果将是:
PK_ID | T1_ID | cross_aggr | T1_PK_IDs
------+-------+------------+-----------
1 | 1 | {A, B, C} | {1, 2, 3}
------+-------+------------+-----------
2 | 1 | {A, B, E} | {1, 2, 5}
------+-------+------------+-----------
3 | 1 | {A, B, G} | {1, 2, 7}
------+-------+------------+-----------
4 | 1 | {A, F, C} | {1, 6, 3}
------+-------+------------+-----------
5 | 1 | {A, F, E} | {1, 6, 5}
------+-------+------------+-----------
6 | 1 | {A, F, G} | {1, 6, 7}
------+-------+------------+-----------
7 | 1 | {D, B, C} | {4, 2, 3}
------+-------+------------+-----------
8 | 1 | {D, B, E} | {4, 2, 5}
------+-------+------------+-----------
9 | 1 | {D, B, G} | {4, 2, 7}
------+-------+------------+-----------
10 | 1 | {D, F, C} | {4, 6, 3}
------+-------+------------+-----------
11 | 1 | {D, F, E} | {4, 6, 5}
------+-------+------------+-----------
12 | 1 | {D, F, G} | {4, 6, 7}
------+-------+------------+-----------
13 | 2 | {H, I} | {8, 9}
------+-------+------------+-----------
14 | 2 | {J, I} | {10, 9}
因此,它返回每个组中值
的每个可能组合,由ID
定义,由count
描述,这些值按每个num
的顺序进行聚合
看起来我必须使用交叉连接
(与线性代数中笛卡尔积的工作方式相同),但是交叉连接
似乎只有在连接
ed表的数量事先已知的情况下才起作用,但是存在计数
的复杂性。计数
本身可能会(我的意思是它没有,但它可以)范围从2
到无限
我曾想过用窗口
函数、按ID
和num
分区来处理它,但在那之后我就被卡住了,因为似乎没有办法得到这些分区的笛卡尔积
我是否应该到此为止,并找到另一种方法来处理数据,或者有没有一种方法可以组成这样一个查询?这听起来像是一个图形漫游问题,需要一个递归查询
with recursive cte as (
select id, num, cnt, 1 as lvl,
array[value::text] as arr_values,
array[pk_id::int] as arr_pk_id
from mytable where num = 1
union all
select c.id, t.num, c.cnt, c.lvl + 1,
c.arr_values || t.value::text,
c.arr_pk_id || t.pk_id
from cte c
inner join mytable t
on t.id = c.id
and t.num = c.num + 1
and t.num <= c.cnt
)
select id, arr_values, arr_pk_id
from cte
where array_length(arr_pk_id, 1) = cnt
order by arr_pk_id
这读起来像是一个图行走问题——需要递归查询
with recursive cte as (
select id, num, cnt, 1 as lvl,
array[value::text] as arr_values,
array[pk_id::int] as arr_pk_id
from mytable where num = 1
union all
select c.id, t.num, c.cnt, c.lvl + 1,
c.arr_values || t.value::text,
c.arr_pk_id || t.pk_id
from cte c
inner join mytable t
on t.id = c.id
and t.num = c.num + 1
and t.num <= c.cnt
)
select id, arr_values, arr_pk_id
from cte
where array_length(arr_pk_id, 1) = cnt
order by arr_pk_id
兄弟,对不起,我是在胡闹。我不敢相信这真的是可能的,似乎SQL有太多我不知道的地方,这就是为什么它对很多人来说是如此有限的原因。但是当像你这样的人进入游戏时,这种语言的潜力被发挥到了极致。非常感谢你,你应该得到比我给你更多的声誉用我的+1.bro抱歉,我是在摆弄这件事。我不敢相信这真的是可能的,似乎SQL有太多我不知道的地方,这就是为什么它对很多人来说如此有限。但是当像你这样的人进入游戏时,这种语言的潜力被发挥到了极致。非常感谢你,你应该得到比我多得多的声誉n给你我的+1。