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。
备注:内容仅供参考。
