0

我创建了一个表。一列称为州,另一列称为土地面积。我正在使用 oracle 11g。我在这里查看了各种问题,但找不到解决方案。这是我到目前为止所尝试的:

SELECT LandAreas, State 
FROM ( SELECT LandAreas, State, DENSE_RANK() OVER (ORDER BY State DESC) sal_dense_rank
       FROM Map ) 
WHERE sal_dense_rank >= 5;

就数量而言,这并没有提供前 5 个土地面积。

我也试过这个,但也不行:

SELECT * FROM Map order by State desc) 
where rownum < 5;

有人有什么建议可以让我走上正轨吗?

这是一张桌子的样本

states      land areas
michagan    15000
florida     25000
tennessee   10000
alabama     80000
new york    150000
california  20000
oregon      5000
texas       6000
utah        3000
nebraska    1000

查询的所需输出:

States      land area
new york    150000
alabama     80000
florida     25000
california  20000
4

4 回答 4

2

尝试:

Select * from 
(SELECT State, LandAreas FROM Map ORDER BY LandAreas DESC)
where rownum < 6

链接到小提琴

于 2014-07-06T02:16:09.580 回答
0

尝试这样的事情

select m.states,m.landarea from map m where (select count('x') from map m2 where m2.landarea > m.landarea)<=5 order by m.landarea

于 2014-07-06T03:03:07.693 回答
0

使用 HAVING 子句并计算状态状态的数量更大:

SELECT m.state, m.landArea
FROM Map m
LEFT JOIN Map m2 on m2.landArea > m.landArea
GROUP BY m.state, m.landArea
HAVING count(*) < 5
ORDER BY m.landArea DESC

请参阅SQLFiddle

这将每个状态连接到面积较大的每个状态,然后使用 HAVING 子句仅返回较大状态数量小于 5 的状态。

平局全部返回,在第 5 次平局的情况下导致超过 5 行。

最大状态的情况需要左连接,它没有其他更大的状态可以连接。

ORDER BY 是可选的。

于 2014-07-06T04:08:44.733 回答
0

您发布的代码中有两个灯笼裤。

  1. 您需要landarea在 DENSE_RANK() 调用中使用。目前,您正在以相反的字母顺序对状态进行排序。
  2. 您在外部查询中的过滤器是错误的方法:您排除了前四个结果。

这是您需要的...

SELECT LandArea, State 
FROM ( SELECT LandArea
              , State
              , DENSE_RANK() OVER (ORDER BY landarea DESC) as area_dr
       FROM Maps ) 
WHERE area_dr <= 5
order by area_dr;

...这是证明这一点的SQL Fiddle 。(我将使用问题中的陈述,即您想要前 5 个最大的州,而忽略了您想要的结果集只有四行这一事实。但请随意调整外部过滤器)。


派生前 N 个结果集有三种不同的函数:DENSE_RANK、RANK 和 ROW_NUMBER。

使用ROW_NUMBER将始终保证结果集中有 5 行,但如果有多个州具有相同的土地面积,则可能会得到错误的结果(在这种情况下不太可能,但其他数据集会产生这种冲突)。所以:1,2,3,4,5

RANK 和 DENSE_RANK 之间的区别在于它们处理平局的方式。 DENSE_RANK总是产生一系列连续的数字,无论每个等级中有多少行。所以:1,2,2,3,3,3,4,5

另一方面,如果给定等级有多个命中,则RANK将产生稀疏系列。所以:1,2,2,4,4,4

请注意,每个示例结果集都有不同的行数。哪一个是正确的?这取决于您要问的确切问题。

使用带有 ROWNUM 伪列的排序子查询将像 ROW_NUMBER 函数一样工作,但我更喜欢使用 ROW_NUMBER,因为它更强大且更防错。

于 2014-07-06T09:39:42.590 回答