1

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

示例数据如下所示:

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 ...)子句比较行组,但无法弄清楚。

我该如何做这两个查询?

4

2 回答 2

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
于 2012-06-21T14:41:53.407 回答
2

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

SELECT DISTINCT fs.FileId, ss.SectionId
FROM FileSlide fs
INNER JOIN SectionSlide ss
ON fs.SlideId= ss.SlideId
于 2012-06-21T14:44:28.327 回答