sql - 复杂的多级分层 SQL
问题描述
如何使用 SQL Server 中的查询实现以下结果。
表:shares_info
复杂的多级层次结构:
comp_name investee
APPLE MS
APPLE INTEL
APPLE MRF
APPLE GOOG
MS GOOG
MS MRF
MRF STF
MRF ABC
GOOG INTEL
GOOG TRF
GOOG XYZ
这个想法是这样的。APPLE投资了MS、INTEL、MRF、GOOG。等等。现在下面的输入类似于出售我的股票,但首先出售没有依赖关系的股票。这就是我的输出所传达的。如果我想出售 GOOG 股票,那么根据我的以下输入,GOOG 依赖于 INTEL/TRF/XYZ,因此在出售 GOOG 之前,我需要出售 (123, XYZ) 和 (456 INTEL)。接下来,如果我想出售 APPLE,它依赖于 MS/INTEL/MRF/GOOG,因此根据以下输入,我需要先出售 INTEL/MRF/GOOG 才能出售 APPLE。
表:shares_sell_info
一些输入
id comp_name
123 APPLE
456 APPLE
123 XYZ
789 GOOG
456 INTEL
243 MRF
432 ABC
顺序应如下所示
123 XYZ (XYZ does not have any dependency and hence should come at the top)
432 ABC (MRF has a dependency on ABC and hence ABC comes on top)
243 MRF (MRF’s dependency is all taken care and hence we have MRF)
456 INTEL (APPLE and GOOGLE has a dependency on INTEL and hence INTEL is on top)
789 GOOG (At this point we can add GOOG because all its dependents are already at top)
123 APPLE (APPLE has a dependency on GOOG and hence GOOG come before APPLE)
456 APPLE
在上面的排序中,XYZ/ABC 中的一个可能是第一个,这并不重要,因为它们都没有任何依赖关系
解决方案
WITH
cte_com as (SELECT * FROM (VALUES
(123 ,'APPLE'),
(456 ,'APPLE'),
(123 ,'XYZ'),
(789 ,'GOOG'),
(456 ,'INTEL'),
(243 ,'MRF'),
(432 ,'ABC')) as cte_com(id, comp))
,cte_temp as (SELECT * FROM (VALUES
('APPLE', 'MS'),
('APPLE', 'INTEL' ),
('APPLE', 'MRF' ),
('APPLE', 'GOOG' ),
('MS', 'GOOG' ),
('MS', 'MRF' ),
('MRF', 'STF' ),
('MRF', 'ABC' ),
('GOOG', 'INTEL' ),
('GOOG', 'TRF' ),
('GOOG', 'XYZ')) as cte_temp(one, two))
SELECT id, comp , one
, count(*) as count
from cte_com
left join cte_temp on cte_temp.one=cte_com.comp
group by id, comp, one
order by count(*)
但目前尚不清楚为什么这个解决方案会给出你想要的顺序。
“XYZ”和“ABC”有什么区别?它们都依赖于其他 1 个组合。
输出:
id comp one count
123 XYZ 1
432 ABC 1
456 INTEL 1
243 MRF MRF 2
789 GOOG GOOG 3
123 APPLE APPLE 4
456 APPLE APPLE 4
7 rows
推荐阅读
- ios - Swift 处理 Tableview Cell 中的播放/暂停按钮
- html - bootstrap - 为什么我的导航栏没有出现在下一行?
- angular - Angular 6+ Guards - 返回 true/false 到 combineLatest 订阅
- angular - 通过服务耗时将数据存储在本地存储中
- sql - 需要从分隔字符串中提取特定属性值
- wpf - VS2017 中的 Wpf 应用
- javascript - Ember if 组件属性的助手
- numpy - 如何从二进制文件中正确选择想要的数据并丢弃不需要的数据
- android - 当我杀死应用程序时服务结束
- c++ - 绕过 Eigen 静态断言