2015-11-04 24 views
1

我想查找出現在STOREID中的次數更多的MOVIEID對。查找在StoreID中出現次數最多的對,並且每個STOREID都只有這對SQL

此外,每個STOREID應該只有這一對作爲MOVIEID s。我的表有2列:STOREIDMOVIEID

例如:

STOREID | MOVIEID 
--------|--------- 
1  | a 
1  | b 
1  | c 
2  | a 
2  | b 
3  | a 
3  | b 
5  | a 
5  | b 

在此情況下,答案將是對:(A,B)的3倍。

提前致謝!

+0

如果您還將行(3,c)添加到表中,您會得到什麼結果? – jarlh

+1

(a,b)2次。只有STOREID 2和5現在有一對。 – Apple12

+1

@ Apple12但是現在(a,b,c)也不會有兩對呢? '(a,b,c) - (1,3)'; '(a,b) - (2,5)'?那麼你會如何選擇?另外,什麼RDBMS? –

回答

0

據我瞭解,你只想考慮賣電影配對的商店。這使它簡單得多。首先你按商店分組,並僅拍攝兩部電影的結果。如果有兩部以上的電影,現在要生成這些對將會非常棘手。你需要開窗功能。但是,對於兩部電影,您將獲得兩部帶聚合功能的電影一個與min和另一個與max。此外,這些功能可以確保,同一對貨物總是具有相同的順序。例如,配對(a,b)將始終爲(a,b),從不會(b,a)

SELECT COUNT(*), MOVIE_1, MOVIE_2 

FROM (
    SELECT MIN(MOVIEID) MOVIE_1 
     ,MAX(MOVIEID) MOVIE_2 
     ,STOREID 
    FROM STORE_MOVIES -- your table 
    GROUP BY STOREID 
    HAVING COUNT(*) = 2 
) MOVIE_PAIRS 

GROUP BY MOVIE_1, MOVIE_2 
ORDER BY COUNT(*) DESC 
FETCH FIRST ROW ONLY; 

對於HAVING COUNT(*) = 2我想加上MOVIEIDSTOREID是獨一無二的。

0

儘管請求沒有意義,但這不是我們關心的設計/實現。我已經完成了一個3部分的自我加入你的電影表。第一個(m1)在同一商店中加入第二個(m2),但對於第二個電影大於(m1)電影。這將防止比較(a,b)和(b,a)的條件。然後,我在同一家商店加入(m2)到(m3),但電影3大於2.這是故意的「左加入」,因爲並非所有商店都會超過2.在此情況下,(m3)將是NULL(不存在)。所以,我正在尋找m3.storeID IS NULL的位置。 (m1)和(m2)之間的JOIN需要第一個和第二個存在。最後,加入HAVING將只顯示出現在多個商店的那些對。

select 
     m1.movieID as Movie1, 
     m2.movieID as Movie2, 
     count(*) TimesPaired 
    from 
     Movies m1 
     JOIN movies m2 
      on m1.storeId = m2.storeId 
      AND m1.movieId < m2.movieId 
      LEFT JOIN movies m3 
       on m2.storeId = m3.storeId 
      AND m2.movieId < m3.movieId 
    where 
     m3.storeId IS NULL 
    group by 
     m1.movieID, 
     m2.movieID 
    having 
     count(*) > 1 
相關問題