【问题标题】:SQL grouping and limiting results per groupSQL 分组和限制每组的结果
【发布时间】:2017-12-19 19:06:36
【问题描述】:

我有一张桌子(你可以在这里看到 http://sqlfiddle.com/#!9/009e8/1),里面有电影,每部电影都有一个类型和上映日期。

CREATE TABLE Movie (
    ID int,
    Title varchar(255),
    Genre varchar(255),
    Year int
);

INSERT into Movie VALUES(1, 'Movie 1', 'Horror', 1982);
INSERT into Movie VALUES(1, 'Movie 2', 'Drama', 1983);
INSERT into Movie VALUES(1, 'Movie 3', 'Horror', 1984);
INSERT into Movie VALUES(1, 'Movie 4', 'Comedy', 1985);
INSERT into Movie VALUES(1, 'Movie 5', 'Sci-Fi', 1986);
INSERT into Movie VALUES(1, 'Movie 6', 'Horror', 1987);
INSERT into Movie VALUES(1, 'Movie 7', 'Drama', 2010);
INSERT into Movie VALUES(1, 'Movie 8', 'Horror', 2008);
INSERT into Movie VALUES(1, 'Movie 9', 'Horror', 2006);
INSERT into Movie VALUES(1, 'Movie 10', 'Comedy', 2004);
INSERT into Movie VALUES(1, 'Movie 11', 'Horror', 2003);
INSERT into Movie VALUES(1, 'Movie 12', 'Drama', 2002);
INSERT into Movie VALUES(1, 'Movie 13', 'Comedy', 1999);
INSERT into Movie VALUES(1, 'Movie 14', 'Drama', 1967);
INSERT into Movie VALUES(1, 'Movie 15', 'Sci-Fi', 1982);
INSERT into Movie VALUES(1, 'Movie 16', 'Drama', 2009);
INSERT into Movie VALUES(1, 'Movie 17', 'Sci-Fi', 2008);

我希望能够获取具有特定类型 (SELECT * FROM Movie WHERE Genre in ('Horror', 'Drama')) 的所有电影,但限制结果每个类型按年份排序

所以,如果我有 100 部剧情片、100 部恐怖片和 100 部喜剧片,我只想要两部最古老的剧情片和两部最古老的恐怖片。

如何在 Sql 中做到这一点?如果在标准 SQL 中这是不可能的,我正在使用 Postgres

【问题讨论】:

  • 我认为可以使用 cte 和 rownumber 来完成

标签: sql postgresql


【解决方案1】:
SELECT
  *
FROM (SELECT
  id,
  title,
  genre,
  year,
  DENSE_RANK() OVER (PARTITION BY genre ORDER BY year) AS year_calc
FROM Movie
WHERE Genre IN ('Horror', 'Drama')) a
WHERE year_calc IN (1, 2);

沙拉湾

【讨论】:

    【解决方案2】:

    正如@Arijit Mukherjee 建议的那样,您可以使用CTEROW_NUMBER()

    ;WITH CTE AS (
      SELECT *, seq = ROW_NUMBER() OVER (PARTITION BY Genre ORDER BY Year ASC)
      FROM Movie
      WHERE Genre in ('Horror', 'Drama')
    )
    SELECT * FROM CTE WHERE seq <= 2
    

    【讨论】:

      【解决方案3】:
      SELECT rank_filter.* FROM (
          SELECT Movie.*, 
          rank() OVER (
              PARTITION BY Genre
              ORDER BY Year
          )
          FROM Movie
      ) rank_filter WHERE RANK IN (1,2)
      

      http://sqlfiddle.com/#!17/009e8/13

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 2017-10-13
        相关资源
        最近更新 更多