`
eyejava
  • 浏览: 1268261 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何有效的取前N大记录?

    博客分类:
  • DB
阅读更多
老二难缠,可能是因为皮蓬的原因,
取第二大的消费金额有以下写法,但是我没有找到最好的办法。因为不仅仅要取第二,还得取最大的和其他一些信息,并且这张表有2000万记录,如果分组后再和自己关联,效率肯定非常难看。

Select * From
(Select exp_amt,Id,Rownum idid From
(Select t.*,Rownum Id From etl_dzdinfo t Where t.main_crd_no='4518100351400218'
And exp_amt Is Not Null And trans_txt = '消费' 
Order By exp_amt Desc ) tt) Where idid=2

Select exp_amt,Id From (
Select t.*,Row_number() over(Order By exp_amt Desc) Id From etl_dzdinfo t Where t.main_crd_no='4518100351400218'
And exp_amt Is Not Null And trans_txt = '消费' ) Where Id=2

Select exp_amt,Id From (
Select t.*,rank() over(Partition By main_crd_no  Order By exp_amt Desc) Id From etl_dzdinfo t 
Where t.main_crd_no='4518100351400218'
And exp_amt Is Not Null And trans_txt = '消费' ) Where Id=2

Select exp_amt,Id From (
Select t.*,dense_rank() over(Partition By main_crd_no  Order By exp_amt Desc) Id From etl_dzdinfo t 
Where t.main_crd_no='4518100351400218'
And exp_amt Is Not Null And trans_txt = '消费' ) Where Id=2

Select Max(exp_amt) From (
Select Max(exp_amt) max_amt From etl_dzdinfo t
Where t.main_crd_no='4518100351400218'  And exp_amt Is Not Null And trans_txt = '消费' 
) a,( Select t.* From etl_dzdinfo t
Where t.main_crd_no='4518100351400218'  And exp_amt Is Not Null And trans_txt = '消费') b
Where b.exp_amt < a.max_amt

为什么就没有象max 这样一个简单易用高效的方法呢? 用起来 就如 maxn(colum,n),那就太幸福了。
分享到:
评论
3 楼 eyejava 2007-04-19  
to taya: 和我最后一种写法一样

楼上的写法看不懂,能说下思路吗?
2 楼 JAVA_ED 2007-04-19  
eyejava 写道
老二难缠,可能是因为皮蓬的原因,
取第二大的消费金额有以下写法,但是我没有找到最好的办法。因为不仅仅要取第二,还得取最大的和其他一些信息,并且这张表有2000万记录,如果分组后再和自己关联,效率肯定非常难看。

Select * From
(Select exp_amt,Id,Rownum idid From
(Select t.*,Rownum Id From etl_dzdinfo t Where t.main_crd_no='4518100351400218'
And exp_amt Is Not Null And trans_txt = '消费' 
Order By exp_amt Desc ) tt) Where idid=2

Select exp_amt,Id From (
Select t.*,Row_number() over(Order By exp_amt Desc) Id From etl_dzdinfo t Where t.main_crd_no='4518100351400218'
And exp_amt Is Not Null And trans_txt = '消费' ) Where Id=2

Select exp_amt,Id From (
Select t.*,rank() over(Partition By main_crd_no  Order By exp_amt Desc) Id From etl_dzdinfo t 
Where t.main_crd_no='4518100351400218'
And exp_amt Is Not Null And trans_txt = '消费' ) Where Id=2

Select exp_amt,Id From (
Select t.*,dense_rank() over(Partition By main_crd_no  Order By exp_amt Desc) Id From etl_dzdinfo t 
Where t.main_crd_no='4518100351400218'
And exp_amt Is Not Null And trans_txt = '消费' ) Where Id=2

Select Max(exp_amt) From (
Select Max(exp_amt) max_amt From etl_dzdinfo t
Where t.main_crd_no='4518100351400218'  And exp_amt Is Not Null And trans_txt = '消费' 
) a,( Select t.* From etl_dzdinfo t
Where t.main_crd_no='4518100351400218'  And exp_amt Is Not Null And trans_txt = '消费') b
Where b.exp_amt < a.max_amt

为什么就没有象max 这样一个简单易用高效的方法呢? 用起来 就如 maxn(colum,n),那就太幸福了。


function(procedure) recursion   如果DB不支持top rowcount(比如sybase)

declare testCursor cursor for
  select max(x) from XX where x not in (select * from #tmp)
open testCursor
fetch testCursor into @x
  if(@num <= n) begin
     insert into #tmp values...
  end
....

select * from #tmp

1 楼 taya 2007-04-19  
来个bt的试试?

select id
  from etl_dzdinfo t1
 where 1 = 1
   and t1.main_crd_no='4518100351400218'
   and t1.exp_amt = (
                      select max(t2.exp_amt)
                        from etl_dzdinfo t2
                       where 1 = 1
                         and t2.main_crd_no='4518100351400218'
                         and t2.exp_amt <> (
                                            select max(t3.exp_amt)
                                              from etl_dzdinfo t3
                                               and t3.main_crd_no='4518100351400218'
                                           )
                     )


自己随便弄了个表试了试
取第2大还是挺快的
可惜没法做到maxn(colum,n)

相关推荐

    SQL 取n到m条记录

    ### SQL取n到m条记录的关键知识点 #### 一、SQL查询特定范围记录的方法与应用场景 在数据库管理中,有时我们需要获取数据表中特定范围的记录。例如,当我们想要显示第n条到第m条记录时,就需要用到特定的SQL语句来...

    MySql实现分组取n条最大记录.txt

    本篇文章详细介绍了如何使用MySQL实现分组取n条最大记录的功能。通过精心设计的SQL查询语句,我们可以有效地解决这类问题。这种方法不仅适用于上述具体场景,还可以扩展应用于其他类似的需求,例如按不同标准分组并...

    分组并排序取前N

    标题“分组并排序取前N”涉及到数据库查询中的一个重要概念,这通常指的是在SQL查询中使用`GROUP BY`、`ORDER BY`以及`LIMIT`子句来对数据进行分组、排序,并提取出每组中排名靠前的N条记录。在数据库管理中,这种...

    三种数据库不同的取前10条记录

    MySQL数据库提供了更为简单的语法来获取前N条记录,即使用`LIMIT`关键字。 **示例代码:** ```sql SELECT t.* FROM tableName t WHERE &lt;其他条件&gt; ORDER BY &lt;排序字段&gt; LIMIT 10; ``` 在这段代码中: - `&lt;其他...

    SQL Server查询前N条记录的常用方法小结

    这种方法避免了`NOT IN`子句的性能问题,通过排序后再取前N条记录,提高了查询效率。 每种方法都有其适用场景,根据实际的数据结构和性能需求,可以选择最适合的查询方式。在处理大量数据时,优化查询语句对于提升...

    xishujuzhen.rar_M?n

    总的来说,从n行m列的稀疏矩阵转换到m行n列的矩阵,本质上是矩阵转置的操作,关键在于正确地处理非零元素的索引变化,并确保在稀疏表示下保持数据结构的有效性和效率。对于实际编程实现,理解并熟练运用合适的数据...

    Hive中分组取topN_row_number-rank和dense_rank的使用.pdf

    在这篇文档中,我们将详细学习在Hive中如何进行分组取topN,以及如何使用row_number()、rank()和dense_rank()三种窗口函数进行数据排序和排名。 首先,Hive中的数据表创建和数据插入操作是数据查询和分析的前提。...

    n皇后问题之不同解

    ### n皇后问题之不同解 #### 一、问题概述与背景 n皇后问题是一个经典的计算机科学问题,最早可追溯到19世纪中期。...通过以上步骤,可以有效地利用分支限界法求解n皇后问题,并在特定条件下显示求解结果。

    记录状态的动态规划dp

    总之,记录状态的动态规划是解决大规模状态问题的有效工具,它结合了位运算的高效性和动态规划的优化策略,能够在保证正确性的前提下,显著降低空间复杂度,提升算法性能。在ACM编程竞赛中,这类技巧是解决问题的...

    n后问题回溯算法 java

    // 记录解的数量 private int n; public NQueens(int n) { this.n = n; board = new int[n]; count = 0; } public void solveNQueens() { placeQueen(0); // 从第一列开始尝试放置皇后 } private ...

    Python视频教程之pandas groupby 分组取每组的前几行记录方法.pdf

    `head(n)`方法返回每个组的前n行。在上面的例子中,`grouped.head(2)`会返回每个班级分数最高的前两个记录。 总结一下,pandas的`groupby`和`head`方法结合使用,可以有效地从分组数据中提取特定记录。这对于数据...

    触发器实现sql记录

    ### 触发器实现SQL记录知识点详解 #### 一、背景与需求分析 在很多应用场景中,为了确保数据完整性及可追溯性,我们往往需要记录数据表中的历史变更信息,以便于日后审计或数据分析。例如,在银行系统中,对账户...

    有效数字与不确定度[收集].pdf

    1. 有效数字中只应保留一位欠准数字,因此在记录测量数据时,只有最后一位有效数字是欠准数字。 2. 在欠准数字中,要特别注意0的情况。0在数字之间与末尾时均为有效数字。 3. π等常数,具有无限位数的有效数字,在...

    计算N以内的和相加等于n的方法的总数

    首先,我们需要理解问题的核心:找出所有可能的数对(或者数列,取决于题目要求),使得这些数的和等于给定的目标值n,且所有数都在1到n的范围内。这个问题可以通过回溯法或动态规划来解决。 1. **回溯法**: 回溯...

    在一堆数中取得前K个最大最小的数的方法

    7. **计数排序变体**:利用哈希表记录每个元素出现的次数,然后线性地从小到大扫描这些元素,直到找到第K个最大或最小的数。平均时间复杂度为O(n)。 - **优点**:线性时间复杂度,效率高。 - **缺点**:需要额外...

    C#实现-回溯求解-N皇后

    N皇后问题起源于国际象棋,它展示了如何通过有效的搜索策略来解决复杂问题。这个问题对于理解计算机科学中的搜索算法、回溯法以及问题的解决方案具有重要的教育价值。它可以帮助开发者提高逻辑思维和算法设计能力。 ...

    石子合并(对于给定n堆石子,编程计算合并成一堆的最小得分和最大得分)

    在每次循环中,我们还需要维护一个变量`sum`来记录从$i$到$j`($j = i + r - 1$)的所有石子数量之和。然后,通过枚举合并的分割点`k`(即第$i$堆到第$k$堆为一组,第$k + 1$堆到第$j$堆为另一组),可以计算出所有...

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录

    排序算法是计算机科学中至关重要的一部分,它涉及到如何有效地组织和排列数据。无论是处理数据库记录、优化数据结构还是解决复杂问题,排序算法都是基础工具。在本文中,我们将深入探讨内部排序算法,包括它们的工作...

    N皇后问题的各种解法

    然而,对于大型的N值,算法的效率和内存使用量都会成为关键因素,此时优化和有效的剪枝策略变得至关重要。 总之,N皇后问题是一个很好的研究和学习算法的实例,它涵盖了递归、迭代和优化的回溯等策略。通过比较这些...

Global site tag (gtag.js) - Google Analytics