You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从sales表中按日期筛选每日Top 30%的交易记录

问题描述

我有一张存储每日交易数据的sales表,表中数据如下:

DateReceiptTotal
4/21/2018325600
4/21/2018326800
4/21/2018327500
4/21/2018328900
4/21/2018329500
4/26/2018330600
4/26/20183311080
4/26/20183321200
4/26/20183331120
4/29/2018334600
4/29/20183351400
5/1/20183361500
5/1/20183374000
5/1/20183386000

现在需要从这张表中筛选出每日交易记录的Top 30%(按交易金额从高到低排序,保留对应比例的记录)。

解决方案

在主流SQL数据库(比如MySQL 8.0+、PostgreSQL、SQL Server等)中,我们可以用窗口函数PERCENT_RANK()来轻松实现这个需求,具体代码如下:

SELECT Date, Receipt, Total
FROM (
    SELECT 
        Date,
        Receipt,
        Total,
        -- 按日期分组,按交易金额降序计算百分比排名
        PERCENT_RANK() OVER (PARTITION BY Date ORDER BY Total DESC) AS pct_rank
    FROM sales
) ranked_sales
-- 筛选出排名在前30%的记录
WHERE pct_rank <= 0.3;
代码说明
  • PARTITION BY Date:把数据按日期拆分成独立的分组,确保我们只在同一天的交易里计算排名,不会跨日期干扰。
  • ORDER BY Total DESC:让每组内的交易按金额从高到低排序,保证金额最高的记录排名最靠前。
  • PERCENT_RANK():计算每条记录在所属日期分组内的百分比排名,取值范围是0到1。比如某一天有5条交易,Top30%就是前1条(5×0.3=1.5,取整后保留前1条);如果有3条交易,Top30%同样保留前1条。
结果验证

拿4/21/2018的数据举例,当日5条交易按金额降序为:900、800、600、500、500。对应的百分比排名分别是0、0.25、0.5、0.75、0.75。筛选pct_rank <= 0.3后,会保留金额为900和800的两条记录,完全符合Top30%的要求。

内容的提问来源于stack exchange,提问作者Sonam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:59:48