PAYATHON 2026

SQL query 查询最大的 due date days passed

数据阿明

结论

不需要先排序。SQL 聚合函数 MAX() 可以直接找出某个账户所有提现记录中最大的 due date days passed。

查询单个账户时,可以这样写:

SELECT MAX(due_date_days_passed) AS max_due_days_passed
FROM withdrawals
WHERE account_id = 1001;

假设该账户的逾期天数是 30、65 和 98,查询结果为:

98

查询所有账户的最大逾期天数

如果要分别统计每个账户,可以使用 GROUP BY:

SELECT
    account_id,
    MAX(due_date_days_passed) AS max_due_days_passed
FROM withdrawals
GROUP BY account_id;

查询会为每个 account_id 返回一行,其中包含该账户所有提现记录的最大逾期天数。

获取最大值对应的完整提现记录

如果还要查询最大逾期天数对应的提现日期、金额和到期日,可以使用窗口函数:

WITH ranked_withdrawals AS (
    SELECT
        account_id,
        withdraw_date,
        amount,
        due_date,
        due_date_days_passed,
        ROW_NUMBER() OVER (
            PARTITION BY account_id
            ORDER BY due_date_days_passed DESC
        ) AS rn
    FROM withdrawals
)
SELECT
    account_id,
    withdraw_date,
    amount,
    due_date,
    due_date_days_passed
FROM ranked_withdrawals
WHERE rn = 1;

其中:

  • PARTITION BY account_id 对每个账户分别排名。
  • ORDER BY due_date_days_passed DESC 按逾期天数从大到小排序。
  • rn = 1 选出每个账户逾期天数最大的记录。

如果多条记录的最大值相同,而且需要全部保留,可以把 ROW_NUMBER() 改为 RANK():

RANK() OVER (
    PARTITION BY account_id
    ORDER BY due_date_days_passed DESC
) AS rn

如果逾期天数需要动态计算

如果表中已有 due_date,通常不建议长期保存可计算的“已逾期天数”,因为这个值会随日期变化。更合适的做法是在查询时根据当前日期计算。

MySQL 写法如下:

SELECT
    account_id,
    MAX(DATEDIFF(CURRENT_DATE, due_date)) AS max_due_days_passed
FROM withdrawals
WHERE due_date < CURRENT_DATE
GROUP BY account_id;

SQL Server 可以这样写:

SELECT
    account_id,
    MAX(DATEDIFF(DAY, due_date, CAST(GETDATE() AS date))) AS max_due_days_passed
FROM withdrawals
WHERE due_date < CAST(GETDATE() AS date)
GROUP BY account_id;

各数据库的日期函数有所不同,应根据实际使用的数据库选择对应写法。

注意事项

due_date_days_passed 应使用数值类型,例如 INT,不要保存为 "98 days" 这样的字符串。对字符串使用 MAX() 时,通常会按字符顺序比较,可能得到错误结果。例如,"9 days" 可能会被判断为大于 "98 days"。

数据库中只保存数值:

98

需要展示单位时再进行拼接:

SELECT CONCAT(MAX(due_date_days_passed), ' days') AS max_due_days_passed
FROM withdrawals
WHERE account_id = 1001;

此外,MAX() 会忽略 NULL。如果某个账户的所有记录都是 NULL,查询结果也会是 NULL。

备注:内容仅供参考。