代码之家  ›  专栏  ›  技术社区  ›  Varun Rao

如何在oracle select sql中使用are not in GROUP BY子句获取其他列?

  •  2
  • Varun Rao  · 技术社区  · 8 年前

    我有一个包含这些数据的表格电影。

    MOVIE_ID  MOVIE_TITLE              CATEGORY        SALES_AMT
    --------- ------------------------ --------------- ----------
    M_0000004 The Boss Baby            Animation       2000
    M_0000006 Star Wars: The Last Jedi Science Fiction 3000
    M_0000007 Get Out                  Horror          4000
    M_0000008 Million Dollar Arm       Action          2000
    M_0000009 The Conjuring            Horror          1000
    M_0000012 The Dark Knight          Action          3000
    

    我需要基于 SALES_AMT 关于 CATEGORY

    MOVIE_ID  MOVIE_TITLE              CATEGORY        SALES_AMT
    --------- ------------------------ --------------- ----------
    M_0000004 The Boss Baby            Animation       2000
    M_0000006 Star Wars: The Last Jedi Science Fiction 3000
    M_0000007 Get Out                  Horror          4000
    M_0000012 The Dark Knight          Action          3000
    

    如果使用GROUP_BY选项,则无法选择 MOVIE_ID 和 MOVIE_TITLE

    select CATEGORY, MAX(SALES_AMT)
    from MOVIE
    group by CATEGORY
    ;
    
    3 回复  |  直到 8 年前
        1
  •  5
  •   Thomas G    8 年前

    尝试使用分析函数和子查询

    select movie_id, movie_title, category, sales_amt 
    from (
      select movie_id, movie_title, category, sales_amt, 
      row_number() over (partition by category order by sales_amt desc) r 
      from movie
    ) where r = 1
    
        2
  •  0
  •   Chris Mack    8 年前

    可以使用RANK()来实现这一点:

    SELECT
        MOVIE_ID
        , MOVIE_TITLE
        , CATEGORY
        , SALES_AMT
    FROM
        (
            SELECT
                MOVIE_ID
                , MOVIE_TITLE
                , CATEGORY
                , SALES_AMT
                , RANK() OVER (PARTITION BY CATEGORY ORDER BY SALES_AMT DESC) RNK
            FROM MOVIE
        ) Q
    WHERE RNK = 1
    

    如果你想在结果中看到重复的结果(销售额相等),否则,请替换 RANK 具有 ROW_NUMBER .

        3
  •  0
  •   Connor McDonald    8 年前

    假设你先运行这个:

    SQL> select deptno, min(sal)
      2  from emp
      3  group by deptno;
    

    然后想让员工 有 最低工资。那么这当然失败了:

    SQL> select deptno, empno, min(sal)
      2  from emp
      3  group by deptno;
    
    ORA-00979: not a GROUP BY expression
    

    但是您可以使用KEEP语法和窗口函数来辅助

    SQL> select deptno, min(sal), min(empno) 
      2    KEEP ( dense_rank FIRST order by sal) empno
      3  from emp
      4  group by deptno
      5  /
    
        DEPTNO   MIN(SAL)      EMPNO
    ---------- ---------- ----------
            10       1300       7934
            20        800       7369
            30        950       7900
    

    其中“EMPNO 7934是指工资为1300的人”