两个表中行的子集之间的重叠/交集

时间:2012-06-21 14:35:20

标签: sql sql-server tsql

我在Sql Server中有两个表,一个包含文件的ID和这些原始文件中包含的幻灯片,另一个包含“sections”,可以包含来自一个或多个文件的幻灯片,可能是任意顺序,重复,和/或删除了一些幻灯片。

示例数据如下所示:

FileSlide

FileID       SlideID
214          716
214          717
214          718
223          770
223          771
223          772
223          773
223          774
223          775

SectionSlide

SectionID    SlideID
527          716
527          718
527          717
527          770
527          773
527          774
527          775
527          774

我最初不需要“SectionFile”关系,但现在我确实需要该信息来查看为特定部分选择的文件,而不管幻灯片细节如何。我的问题是检查SectionSlideFileSlide表之间的幻灯片ID,以查看任何给定的文件 - 节对中的幻灯片之间是否存在重叠。我想找到共享幻灯片的所有文件 - 节对。

对于上面的示例数据,输出如下所示:

SectionFileCandidates

SectionID    FileID
527          214
527          223

生成此输出的查询是什么?

是否可以计算指示该部分中原始文件幻灯片的比例的指标?

对于上面的示例数据,输出如下所示:

SectionFileCandidates

SectionID    FileID    Overlap
527          214       1.00
527          223       0.67

...也就是说,来自文件214的3张幻灯片中的3张位于第527节,来自文件223的6张幻灯片中的4张位于第527节。

我最初尝试使用OVER (PARTITION BY ...)子句比较行组,但无法弄明白。

我该如何进行这两个查询?

2 个答案:

答案 0 :(得分:3)

这两个查询都是可能的!


首先查询:

SELECT s.SectionID,
       f.FileID
FROM SectionSlide s
INNER JOIN FileSlide f ON s.SlideID = f.SlideID
GROUP BY s.SectionID, f.FileID

SELECT DISTINCT s.SectionID,
                f.FileID
FROM SectionSlide s
INNER JOIN FileSlide f ON s.SlideID = f.SlideID

第二次查询:

select s.SectionID, f.FileID,
       round(((count(distinct f.SlideID)*1.0) / aux.total), 2) as 'Overlap'
from SectionSlide s
inner join FileSlide f on f.SlideID = s.SlideID
inner join (select f.FileID, count(f.SlideID) as 'total'
            from FileSlide f
            group by f.FileID) aux on aux.FileID = f.FileID
group by f.FileID, s.SectionID, aux.total

答案 1 :(得分:2)

我对您的问题感到困惑,但下面的查询可以为您提供所需的结果:

SELECT DISTINCT fs.FileId, ss.SectionId
FROM FileSlide fs
INNER JOIN SectionSlide ss
ON fs.SlideId= ss.SlideId