如何解决如何在多对多关系中创建相关条目的群集?
我有一张订阅用户表,其中包含联系人ID和订单ID。多个联系人可以链接到一个订单,而一个联系人可以链接到多个订单。我正在尝试接受给定的订单,查看该订单的用户,确定与这些用户相关的任何其他订单,并将它们链接为一个公司,如下表所示:
解决方法
显然我错了,SQL确实提供了一种解决您的问题的方法。这是我的解决方案。尚未针对运行时效率进行优化-如果有必要,我可以再看一遍:
library(ggplot2)
library(tidyverse)
library(patchwork)
#Data
da = data.frame(id = c(1,1,2,3,4,4),day = c(1,var1= c(3,5,3),var2 = c(1,2))
#Plots
G1 <- da %>% ggplot(aes(x= day,y = var1)) + geom_line()+ facet_wrap(~id,nrow = 1)
G2 <- da %>% ggplot(aes(x= day,y = var2)) + geom_line()+ facet_wrap(~id,nrow = 1)
#Bind plots
G1/G2
wrap_plots(G1,G2,ncol = 1)
在第一部分中,我定义了一个递归查询with recursive
incompany(contact,order1,order2)
as (select contact,o1.orderID as order1,o2.orderID as order2
from orders o1 join orders o2 using (contact)
union
select o1.contact,inc.order1,o2.orderID as order2
from incompany as inc,orders as o1,orders as o2
where inc.order2=o1.orderID and o1.contact=o2.contact)
select contact,sum(order1) as MyNewCompanyID from
(select distinct contact,order1 from incompany) as foo
group by contact;
,该查询完成了大部分工作,并将同一公司中另一个联系人使用的每个incompany
分配给该联系人。因此orderID
本身将返回下表:
select * from incompany;
查询的第二部分基本上只是将该表缩短到必要的最小值,然后创建一种新的“公司ID”(+---------+--------+--------+
| contact | order1 | order2 |
+---------+--------+--------+
| a | 1 | 1 |
| a | 1 | 2 |
| a | 2 | 1 |
| a | 2 | 2 |
| a | 3 | 1 |
| a | 3 | 2 |
| b | 1 | 1 |
| b | 2 | 1 |
| b | 3 | 1 |
| c | 1 | 1 |
| c | 2 | 1 |
| c | 3 | 1 |
| d | 1 | 2 |
| d | 1 | 3 |
| d | 2 | 2 |
| d | 2 | 3 |
| d | 3 | 2 |
| d | 3 | 3 |
| e | 4 | 4 |
| e | 4 | 5 |
| e | 5 | 4 |
| e | 5 | 5 |
| f | 4 | 4 |
| f | 5 | 4 |
| g | 4 | 5 |
| g | 5 | 5 |
+---------+--------+--------+
)作为该公司使用的所有订单的总和。对于您的示例,它返回下表:
MyNewCompanyID
+---------+----------------+
| contact | MyNewCompanyID |
+---------+----------------+
| a | 6 |
| b | 6 |
| c | 6 |
| d | 6 |
| e | 9 |
| f | 9 |
| g | 9 |
+---------+----------------+
部分的作用
在第一部分中,我定义了诸如临时视图之类的内容,以后可以像常规表一样对其进行访问。在内部,它必须首先包含一个常规查询,再由第二个查询合并,然后才能递归访问自己。
如果您想了解有关这种递归的更多信息,我推荐以下两个视频:
编辑
要为每个公司分配唯一的号码,您可能应该使用with
,如此处所述:https://www.sqlservertutorial.net/sql-server-window-functions/sql-server-row_number-function/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。