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

老二难缠,可能是因为皮蓬的原因,
取第二大的消费金额有以下写法,但是我没有找到最好的办法。因为不仅仅要取第二,还得取最大的和其他一些信息,并且这张表有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),那就太幸福了。
采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
参考资源链接:[MySQL GROUP BY 分组每组N条记录的三种方法](https://wenku.youkuaiyun.com/doc/6453096cea0840391e76c7b3?utm_source=wenku_answer2doc_content) 为了有效地从每个分组中提N条记录,可以采用以下三种策略:利用LEFT JOIN和HAVING子句、使用嵌套的子查询以及应用LIMIT子句。每种方法都有其适用场景,下面将详细介绍每一种方法的操作步骤以及其适用性。 方法一:利用LEFT JOIN和HAVING子句 此方法适用于数据量不是非常的情况。通过LEFT JOIN连接同一表的两个实例,并在ON条件中加入比较逻辑,然后通过GROUP BY进行分组。HAVING子句用于筛选出每个分组中符合条件的记录。示例如下: ```sql SELECT s.id, s.name, s.group_id, s.score FROM students s LEFT JOIN students s2 ON s.group_id = s2.group_id AND s.score < s2.score GROUP BY s.id, s.name, s.group_id, s.score HAVING COUNT(s2.id) < 2 ORDER BY s.group_id, s.score DESC; ``` 在上述查询中,我们选每个group_id中分数最高的两名学生。 方法二:使用嵌套的子查询 这种方法适合于对性能要求较高的场景,因为它只涉及一次表扫描。嵌套子查询先计算每个分组中符合条件的记录数量,然后在外部查询中筛选出符合条件的记录。示例如下: ```sql SELECT * FROM students s WHERE 2 > ( SELECT COUNT(*) FROM students WHERE group_id = s.group_id AND score > s.score ) ORDER BY s.group_id, s.score DESC; ``` 此查询中,内部子查询为每个学生计算了同组中分数比他高的学生数量,外部查询则根据这个数量来确定是否选该学生记录。 方法三:使用LIMIT子句 使用LIMIT子句的方法适用于简单的分组N条记录的场景,但需注意正确关联子查询和外部查询。示例如下: ```sql SELECT s.* FROM students s WHERE s.id IN ( SELECT s2.id FROM students s2 WHERE s2.group_id = s.group_id ORDER BY s2.score DESC LIMIT 2 ) ORDER BY s.group_id, s.score DESC; ``` 在这个示例中,子查询先选出每个分组中分数最高的两名学生的ID,外部查询再根据这些ID获对应的学生信息。需要注意的是,在子查询中没有指定外部引用,可能导致错误,一般会添加一个额外的条件来确保子查询能正确关联到外部表。 每种方法在不同场景下的性能表现和实现复杂度都不同,建议根据实际数据量、查询性能需求以及使用的MySQL版本来选择最合适的方法。在处理型数据集时,优化查询效率就显得尤为重要,比如合理使用索引可以显著提高查询速度。 参考资源链接:[MySQL GROUP BY 分组每组N条记录的三种方法](https://wenku.youkuaiyun.com/doc/6453096cea0840391e76c7b3?utm_source=wenku_answer2doc_content)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值