oracle top n sentences

本文介绍了Oracle数据库中实现TOP-N查询的方法,包括基本的TOP-N查询、带条件的TOP-N查询及分页查询等,并展示了如何在涉及多表连接的情况下进行TOP-N查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle has some sentences for top n 

version oracle 10g 11g


TOP-N
SELECT * FROM (
  SELECT name, id
  FROM test
  ORDER BY id DESC
) WHERE rownum <= 5;
SELECT * FROM (
  SELECT name, id 
  FROM test
  WHERE type='0'
  ORDER BY id DESC 
) WHERE rownum <= 5;
分页
SELECT * FROM (
  SELECT * FROM (
    SELECT name, id,
      rownum AS rn
    FROM test
    WHERE type='0'
    ORDER BY id DESC
  ) WHERE rownum <= 20
) WHERE rn > 10;
Top-N with joins
SELECT * FROM (
  SELECT t.name , t.id,  e.dept
  FROM test t, em_ct e
  WHERE t.id = e.id
    AND t.type='0'
  ORDER BY t.idDESC
) WHERE rownum <= 5
/


### 实现Apache Storm中的Top N处理 在Apache Storm中实现Top N处理可以通过设计特定的拓扑结构来完成。这种类型的处理通常涉及多个组件之间的协作,包括Spout用于数据输入、Bolt负责中间计算以及最终聚合结果。 #### Spout定义 首先需要定义一个`Spout`作为数据源,模拟或读取实际的数据流。对于Top N应用场景来说,这可能意味着从文件、数据库或其他外部服务获取记录。 ```java public class SentenceSpout extends BaseRichSpout { private SpoutOutputCollector collector; private boolean completed = false; @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { this.collector = collector; } @Override public void nextTuple() { if (!completed) { String[] sentences = new String[]{ "the cow jumped over the moon", "an apple a day keeps the doctor away" }; for (String sentence : sentences) { collector.emit(new Values(sentence)); } completed = true; } Thread.sleep(10); // Simulate time between emits } @Override public void ack(Object id) {} @Override public void fail(Object id) {} } ``` 此部分代码展示了如何创建一个简单的句子发射器[^1]。 #### 中间层Bolt:解析与计数 接下来是构建一系列bolt来进行单词分割和频率统计工作: ```java // SplitSentence Bolt splits each incoming tuple into words. public static class SplitSentence extends BaseBasicBolt { @Override public void execute(Tuple input, BasicOutputCollector collector) { String sentence = input.getString(0); for (String word : sentence.split(" ")) { collector.emit(new Values(word.toLowerCase())); } } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("word")); } } // WordCount bolt maintains counts of occurrences per word across all tuples it receives. public static class WordCounter extends BaseStatefulWindowedBolt<WordCounts> implements ICombinerAggregator<Integer, Integer, WordCounts>, ISnapshotable<WordCounts> { transient Map<String, Long> counters; protected synchronized Map<String, Long> getCounters(){ return counters != null ? counters : Collections.emptyMap(); } @Override public void prepare(@Nullable Object checkpointData, Map map, TopologyContext topologyContext){ super.prepare(checkpointData,map,topologyContext); counters=topologyContext.getThisTaskIndex()==0?new HashMap<>():null; } @Override public void updateState(Window window, Collection<Tuple> tuples){ for (Tuple t:tuples){ String w=t.getStringByField("word"); long c=getCounters().getOrDefault(w, 0L)+1; getCounters().put(w,c); } } @Override public void emitBatchResult(BatchMark batchMark, Window window, List<Tuple> tuplesToAcknowledge){ getOutputCollector().emit(new Values(getCounters())); tuplesToAcknowledge.forEach(this::ack); } ... } ``` 上述代码片段实现了两个主要的功能模块——一个是将接收到的字符串切分成单个词汇;另一个则是累积这些词频信息[^2]。 #### 终端Bolt:Top N逻辑 最后一步是在终端节点处实施Top N的选择机制。这里可以采用优先队列(PriorityQueue)或者其他高效的数据结构来维护当前最高的几个条目。 ```java import java.util.PriorityQueue; import org.apache.storm.tuple.Tuple; public class TopNFinder extends BaseBasicBolt { int n; PriorityQueue<Map.Entry<String,Long>> queue; public TopNFinder(int numItems) { n=numItems; queue=new PriorityQueue<>(n,(a,b)->b.getValue().compareTo(a.getValue())); } @Override public void execute(Tuple input, BasicOutputCollector collector) { Map<String, Long> counts=(HashMap<String, Long>)input.getValue(0); for (Entry<String, Long> entry : counts.entrySet()) { if(queue.size()<this.n || entry.getValue()>queue.peek().getValue()){ queue.offer(entry); if(queue.size()>this.n){ queue.poll(); // Remove lowest priority item when exceeding limit } } } ArrayList<Map.Entry<String,Long>> sortedList=Lists.newArrayList(queue.iterator()); Collections.sort(sortedList,new Comparator<Map.Entry<String,Long>>() { @Override public int compare(Entry<String, Long> o1, Entry<String, Long> o2) { return -(o1.getValue()).compareTo(o2.getValue()); // Descending order } }); collector.emit(sortedList.stream() .map(e->e.getKey()+"="+e.getValue()) .collect(Collectors.joining(", ")) ); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("topNWords")); } } ``` 这段Java代码展示了一个名为 `TopNFinder` 的类,它接收来自上游组件传递过来的地图形式的键值对集合,并从中筛选出前N个最高频率出现过的词条[^3]。 通过组合以上各个阶段的操作,就可以搭建起一套完整的针对实时数据分析需求而优化的工作流程,在这个过程中不仅能够有效地追踪到最常提及的内容项,同时也支持灵活调整参数以适应不同的业务场景要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值