我在Postgres中有下表,在两列a_sno
和中有重叠的数据b_sno
。
create table data
( a_sno integer not null,
b_sno integer not null,
PRIMARY KEY (a_sno,b_sno)
);
insert into data (a_sno,b_sno) values
( 4, 5 )
, ( 5, 4 )
, ( 5, 6 )
, ( 6, 5 )
, ( 6, 7 )
, ( 7, 6 )
, ( 9, 10)
, ( 9, 13)
, (10, 9 )
, (13, 9 )
, (10, 13)
, (13, 10)
, (10, 14)
, (14, 10)
, (13, 14)
, (14, 13)
, (11, 15)
, (15, 11);
从前6行可以看到,两列中的数据值4,5,6和7相交/重叠,需要将其划分为一组。第7-16行和第17-18行将分别标记为组2和3。
结果输出应如下所示:
group | value
------+------
1 | 4
1 | 5
1 | 6
1 | 7
2 | 9
2 | 10
2 | 13
2 | 14
3 | 11
3 | 15
假设所有对在它们的镜像的组合中也存在(4,5)
和(5,4)
。但是以下解决方案也可以在没有镜像重复对象的情况下正常工作。
所有连接都可以 按单个升序排列
,不可能出现像我在小提琴中添加的那样的复杂情况,我们可以使用此解决方案,而无需在rCTE中重复:
我从获取a_sno
每个组的最小值开始,并具有最小的关联值b_sno
:
SELECT row_number() OVER (ORDER BY a_sno) AS grp
, a_sno, min(b_sno) AS b_sno
FROM data d
WHERE a_sno < b_sno
AND NOT EXISTS (
SELECT 1 FROM data
WHERE b_sno = d.a_sno
AND a_sno < b_sno
)
GROUP BY a_sno;
结果:
grp a_sno b_sno
1 4 5
2 9 10
3 11 15
我避免使用分支和重复的(重复的)行-长链可能 会 更昂贵。我ORDER BY b_sno LIMIT 1
在相关子查询中使用了递归CTE。
性能的关键是匹配索引,它已经由PK约束提供了:反之则PRIMARY KEY (a_sno,b_sno)
不行
:(b_sno, a_sno)
复合索引对第一个字段的查询是否也有用?
WITH RECURSIVE t AS (
SELECT row_number() OVER (ORDER BY d.a_sno) AS grp
, a_sno, min(b_sno) AS b_sno – the smallest one
FROM data d
WHERE a_sno < b_sno
AND NOT EXISTS (
SELECT 1 FROM data
WHERE b_sno = d.a_sno
AND a_sno < b_sno
)
GROUP BY a_sno
)
, cte AS (
SELECT grp, b_sno AS sno FROM t
UNION ALL
SELECT c.grp
, (SELECT b_sno – correlated subquery
FROM data
WHERE a_sno = c.sno
AND a_sno < b_sno
ORDER BY b_sno
LIMIT 1)
FROM cte c
WHERE c.sno IS NOT NULL
)
SELECT * FROM cte
WHERE sno IS NOT NULL – eliminate row with NULL
UNION ALL – no duplicates
SELECT grp, a_sno FROM t
ORDER BY grp, sno;
从根(最小sno
)到一个或多个分支,可以按升序到达所有节点。
这次,获得 所有 更大sno
和重复数据删除的节点,这些节点可能在最后访问了多次UNION
:
WITH RECURSIVE t AS (
SELECT rank() OVER (ORDER BY d.a_sno) AS grp
, a_sno, b_sno -- get all rows for smallest a_sno
FROM data d
WHERE a_sno < b_sno
AND NOT EXISTS (
SELECT 1 FROM data
WHERE b_sno = d.a_sno
AND a_sno < b_sno
)
)
, cte AS (
SELECT grp, b_sno AS sno FROM t
UNION ALL
SELECT c.grp, d.b_sno
FROM cte c
JOIN data d ON d.a_sno = c.sno
AND d.a_sno < d.b_sno -- join to all connected rows
)
SELECT grp, sno FROM cte
UNION -- eliminate duplicates
SELECT grp, a_sno FROM t -- add first rows
ORDER BY grp, sno;
与第一种解决方案不同,我们在这里没有得到带有NULL的最后一行(由相关子查询引起)。
校验者: @peels 翻译者: @Counting stars 交叉分解模块主要包含两个算法族: 偏最小二乘法(PLS)和典型相关分析(CCA)。 这些算法族具有发现两个多元数据集之间的线性关系的用途: fit method (拟合方法)的参数 X 和 Y 都是 2 维数组。 交叉分解算法能够找到两个矩阵 (X 和 Y) 的基础关系。它们是对在两个空间的 协方差结构进行建模的隐变量方法。它们将尝
假设我有一个表,它有两列X1和X2,其中X1总是小于X2。每行构成一定的范围(X1,X2)。可能有几行的X1/X2范围重叠,从而产生更大的范围(X1n,X2m)。 有没有办法使用标准SQL查询来查找所有这些范围? 例如,该表可能如下所示: 预期产出将是: 我非常感谢您在正确方向上对我们的帮助。 我正在使用sqlite。
本文向大家介绍Microsoft SQL Server 交叉连接,包括了Microsoft SQL Server 交叉连接的使用技巧和注意事项,需要的朋友参考一下 示例 A cross join是笛卡尔联接,表示两个表的笛卡尔乘积。此联接不需要任何条件即可联接两个表。左表中的每一行将连接到右表中的每一行。交叉联接的语法: 例: 结果: 请注意,还有其他方法可以应用CROSS JOIN。这是无条件的
问题内容: 我有三个表: 1)应用程序(AppId,名称) 2)屏幕(ScreenId,名称) 3)关系(AppId,ScreenId) 现在,我想对相关表施加一些限制:可以将同一屏幕分配给多个应用程序,但是不能将两个具有相同名称的屏幕分配给同一应用程序。 我知道我可以将Screen.Name添加到关系表中,然后在AppId和Screen.Name上创建PK,但是我不希望这样的解决方案,因为Scr
在二分图中,左边有n个节点,右边有m个节点。节点的顺序是从1到n和从1到m。左边的节点连接到右边的节点。没有连接所有节点。对于例如: 我想知道如何像一些用户提到的那样,通过使用二进制索引树来解决这个问题。我用O(n^2)algo求解,得到Tle。 这不是家庭作业。昨天我学习了BIT,正在寻找一些问题,所以我遇到了这个。告诉我诀窍。请不要写整个程序。
问题内容: 我希望有人曾经尝试过这种方法,在我进一步尝试之前可以得到一些建议。 我希望产生类似于sql-server 2000中的交叉表查询的内容。 我有一个类似于以下内容的表结构: 我想做的是通过查询/存储过程来整理数据,以使构建报告更容易。 理想的解决方案将产生如下结果: 问题答案: 我最终使用存储过程(http://www.sqlteam.com/article/dynamic-cross-