我有一张桌子,上面列出了一周内越过一条路的所有车辆。现在我想知道在这条路上观察到的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个。
但我不知道如何做最后两步。
谢谢。
答案 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()
!)
简而言之,窗口函数为您提供ROWNUM
和FETCH FIRST
解决方案不具备的灵活性。