【问题标题】:How can I get the smallest row我怎样才能得到最小的行
【发布时间】:2011-03-30 23:21:19
【问题描述】:

如何从生成的表中获取最小行我的意思是生成表,我将通过子查询生成一个表来计算记录,然后我将获得最小行。

换句话说,我要解决的问题
我有一个表:works_on,其中包含从事 pnumber 标识的项目的员工的所有 ssn
我想确定包含最少员工人数的项目的 pnumber

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    最大...保持

    SELECT MAX( pnumber) KEEP (DENSE_RANK FIRST ORDER BY cnt DESC)
    FROM
      (SELECT pnumber, count(*) cnt
      FROM works_on
      GROUP BY pnumber)
    

    如果您有多个具有相同最小值的项目,它会变得有点复杂。

    SELECT pnumber FROM works_on
    GROUP BY pnumber
    HAVING COUNT(*) =
      (SELECT MAX( cnt) max_cnt
      FROM
        (SELECT pnumber, count(*) cnt
        FROM works_on
        GROUP BY pnumber))
    

    【讨论】:

    • 为什么要比较最大计数?问题是找到最小值。
    【解决方案2】:

    您可以尝试其他几个选项。

    您可以尝试基于 rownum 的简单方法

    select *
    from (
      SELECT pnumber, count(*) cnt
      FROM works_on
      GROUP BY pnumber
      order by cnt
    )
    where rownum < 2
    

    或使用RANK 解析函数。 DENSE_RANKROW_NUMBER 函数的工作方式相似(但每个函数略有不同。

    SELECT *
    FROM (
      SELECT pnumber, cnt, rank() over (order by cnt) as my_rank
      from (
        SELECT pnumber, count(*) cnt
        FROM works_on
        GROUP BY pnumber
      )
    )
    WHERE my_rank = 1
    

    【讨论】:

      【解决方案3】:
      select * from (
      
      select pnumber , count (pnumber)counter from works_on 
      
      group by pnumber
      
      )
      
      where counter=(select min(counter) from (select pnumber , count (pnumber)counter from works_on 
      
      group by pnumber
      
      ))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多