【问题标题】:Oracle restrict rows based on categoryOracle根据类别限制行
【发布时间】:2019-07-22 12:04:52
【问题描述】:

我有一个如下的数据库结构:

id  value  category
1   val1     6
2   val2     6
3   val3     5
4   val4     7
5   val5     8
5   val5     5

我需要根据排序后的类别数显示结果。假设如果类别的值为 2,那么结果应该是:

id  value  category
    3   val3     5
    5   val5     5
    1   val1     6
    2   val2     6

这是一个动态表,一段时间后可能会删除类别 6 的记录,现在如果类别为 2,我们需要显示:

id  value  category
3   val3     5
5   val5     5
4   val4     7

经过研究,我发现一种解决方案是使用 rownum:

SELECT * FROM TABLE WHERE CATEGORY IN
(SELECT CATEGORY FROM 
(SELECT ROWNUM ROWNUMBER, CATEGORY FROM 
(SELECT CATEGORY FROM TABLE GROUP BY CATEGORY ORDER BY CATEGORY)) WHERE ROWNUMBER >= 2)

但我知道这不是很有效。有没有更优化的方法?

【问题讨论】:

  • "假设如果类别的值为 2,那么结果应该是......" 为什么?没有 2 的类别,2 与获得 5 和 6 的类别有何关系?还是与类别中的行数有关?或者获取多个类别?为什么如果删除了第 6 类,你应该返回第 7 类而不是第 8 类?您确定您发布的示例代码给出了您期望的结果,因为它没有给出您发布的任何一个输出吗? (db<>fiddle)

标签: sql oracle oracle10g


【解决方案1】:

您似乎想选择计数最高的n 类别。如果是这样:

select t.*
from (select t.*,
             dense_rank() over (order by cnt desc, category desc) as seqnum
      from (select t.*, count(*) over (partition by category) cnt
            from t
           ) t
     ) t
where seqnum <= 2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多