2012-06-21 96 views
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 

...也就是說,3出從文件214 3張幻燈片的是在部分527和4出從文件223的6張幻燈片是在第527部分。

我最初試圖比較使用OVER (PARTITION BY ...)子句的行的組,但無法弄清楚。

我該如何做這兩個查詢?

回答

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 
+0

但對於重疊列 –

+0

@ShehzadBilal是在第二個查詢。 –

+0

作爲註釋,在SQL Server中,整數上的「/」返回一個整數,因此重疊將爲0或1.拋出「* 1.0」轉換爲浮點數。 –

2

我小號的ORT您的問題感到困惑,但下面的查詢應該得到你想要的結果:

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

是的,這是訣竅,謝謝。非重疊計算版本比我想象的要容易得多。 – Dave