2015-11-04 58 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 
相关问题