查找StoreID中出现次数最多的pairs并且每个STOREID都只有这个pair SQL

Posted

技术标签:

【中文标题】查找StoreID中出现次数最多的pairs并且每个STOREID都只有这个pair SQL【英文标题】:Find the pairs that appear the most times in StoreID and each STOREID has only this pair SQL 【发布时间】:2016-02-04 19:01:21 【问题描述】:

我想找出在STOREID 中出现次数较多的MOVIEID 对。

此外,每个STOREID 应该只有这一对作为MOVIEIDs。我的表有 2 列:STOREIDMOVIEID

例如:

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

在这种情况下,答案是 pair: (a,b) 3 次。

提前致谢!

【问题讨论】:

如果将行 (3,c) 也添加到表中,您期望什么结果? (a,b) 2 次。现在只有 STOREID 2 和 5 有一对。 @Apple12 但是现在 (a,b,c) 不是也有两对吗? (a,b,c) - (1, 3); (a,b) - (2, 5)?那你会怎么选择?还有,什么 RDBMS? 对我的意思是只有 2 项 MOVIEID。所以每个 STOREID 只有两个(对)MOVIEID。在您的情况下,STOREID 1 和 3 有 3 个 MOVIEID。谢谢! 您使用的是哪个 DBMS? 【参考方案1】:

据我了解,您只想考虑出售电影对的商店。这使它变得简单了很多。首先,您按商店分组,然后仅使用两部电影获取这些结果。如果有两部电影以上,现在生成一对会很棘手。您将需要窗口函数。但是,对于两个,您将获得具有聚合功能的两部电影。一个是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 是唯一的。

【讨论】:

【参考方案2】:

尽管该请求没有真正意义,但这不是我们需要关注的设计/实现。我已经完成了对你的电影表的 3 部分自连接。第一个 (m1) 加入到同一商店的第二个 (m2),但第二部电影大于 (m1) 电影。这将防止比较 (a,b) 与 (b,a) 的条件。然后,我通过同一家商店将 (m2) 连接到 (m3),但电影 3 大于 2。这是有意的 LEFT-JOIN,因为并非所有商店都会超过 2。在这种情况下,(m3) 处的值将为 NULL(不存在)。所以,我正在寻找 m3.storeID 为 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

【讨论】:

以上是关于查找StoreID中出现次数最多的pairs并且每个STOREID都只有这个pair SQL的主要内容,如果未能解决你的问题,请参考以下文章

排列并查找列表中出现次数最多的项目

JS中如何查找出现次数最多的字节

找出字符串中出现次数最多的字符和次数

Js对象(五)如何查找字符串中出现次数最多的字符 2021-11-24

js查找字符串中出现次数最多的字符

查找输入字符串中出现字符次数最多的那个字和重复次数