查询以显示最高计数的前10行

时间:2018-03-31 09:12:47

标签: sql oracle

我有一张桌子,上面列出了一周内越过一条路的所有车辆。现在我想知道在这条路上观察到的10辆车中最多的是什么。

我的想法是:

1)对汽车进行分组并计算他们越过公路的次数:

public class ExampleWorking {
    public static void main(String[] args) {
        String  firstNumber,
                secondNumber,
                opp;
        int number1,
            number2,
            results;
        boolean use;
        firstNumber = JOptionPane.showInputDialog("Enter First integer");
        secondNumber = JOptionPane.showInputDialog("Enter Second integer");
        opp = JOptionPane.showInputDialog("Enter Method");
        number1 = Integer.parseInt(firstNumber);
        number2 = Integer.parseInt(secondNumber);
        use = boolean.parseBoolean(opp);
        if (use="+") {
            results= number1 + number2;
        }
        else{
            if(use="-"){
                results=number1 - number2;
            }
            else{
                if (use="*"){
                    results=number1 * number2;
                } else {
                    if (use="/") {
                        results=number1/number2;
                    } else {
                        System.out.println("Hello World");
                    }
                }
            }
        }
        JOptionPane.showMessageDialog(null, "The Results is " + results , "Results", JOptionPane.PLAIN_MESSAGE);
        System.exit(0);
    }
}       

我必须这样做,因为我可以在同一周内多次观察同一辆车。

2)按照从最高到最低的顺序对此组进行排序。

3)取这些结果中的前10个。

但我不知道如何做最后两步。

谢谢。

3 个答案:

答案 0 :(得分:1)

这适用于Oracle 12c及更高版本:

SELECT nplate,
       COUNT(*)
FROM   observations
GROUP  BY nplate
ORDER  BY COUNT(*) DESC
FETCH FIRST 10 ROWS ONLY;  

答案 1 :(得分:0)

你可以order by count(*) desc。将结果限制为10行的Oracle方法是使用子查询,后跟where rownum < N

SELECT  *
FROM    (
        SELECT  nplate
        ,       count(*) 
        from    observations 
        group by 
                nplate
        order by
                count(*) desc
        ) sub
WHERE   rownum <= 10

您的示例使用count('x'),它计算'x' is not null的行数。这不会有害,但它也没有意义。

答案 2 :(得分:0)

我很惊讶没有人使用窗口(分析)函数ROW_NUMBER()给出答案:

SELECT nplate, observation_cnt FROM (
   SELECT nplate, COUNT(*) AS observation_cnt
        , ROW_NUMBER() OVER ( ORDER BY COUNT(*) DESC ) AS rn
     FROM observations
    GROUP BY nplate
) WHERE rn <= 10
 ORDER BY rn;

如果nplate的两个(或更多)值具有相同的观察数量,并且所有观察值都是第10位,并且您获得所有观察值非常重要,那么您将获得所有观察值。我想改为使用窗口函数RANK()

SELECT nplate, observation_cnt FROM (
   SELECT nplate, COUNT(*) AS observation_cnt
        , RANK() OVER ( ORDER BY COUNT(*) DESC ) AS rn
     FROM observations
    GROUP BY nplate
) WHERE rn <= 10
 ORDER BY rn;

(你可能也想要DENSE_RANK()!)

简而言之,窗口函数为您提供ROWNUMFETCH FIRST解决方案不具备的灵活性。