mysql - 如何根据MYSQL中的日期获取记录
问题描述
我有样本数据
ID Name Amount cal_amt Run_amt Dates
1 Test 15000 0.00 15000 2020-06-01
1 Test 15000 0.00 30000 2020-04-01
1 Test 15000 12000 30000 2020-05-01
2 Test_1 18000 0.00 25000 2020-06-01
2 Test_1 18000 0.00 35000 2020-04-01
2 Test_1 18000 16000 35000 2020-05-01
我需要获得 MAX(月)的 Run_Amount 即:2020-06-01 --> 15000
需要获取当月的 cal_amt 即:2020-05-01 --> 12000 和 0.00 也与本月相关 2020-04-01
我需要得到这样的输出:
ID Name Amount cal_amt Run_amt
1 Test 15000 12000 15000
2 Test_1 18000 16000 25000
它是示例数据,但还有另外几列我已经尝试使用MAX() 条件 和
ROW_NUMBER()over (PARTITION BY run_amt order by Date )
谁能建议我最好的方法
解决方案
使用ROW_NUMBER()
窗口函数获取具有Run_amt
最大月份的行,然后使用条件聚合:
SELECT t.ID, t.Name, t.Amount,
MAX(CASE WHEN LAST_DAY(Date) = LAST_DAY(CURRENT_DATE) THEN cal_amt END) cal_amt,
MAX(CASE WHEN t.rn = 1 THEN Run_amt END) Run_amt
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY ID, Name, Amount ORDER BY Date DESC) rn
FROM tablename
) t
GROUP BY t.ID, t.Name, t.Amount
或者:
SELECT t.ID, t.Name, t.Amount,
MAX(t.cal_amt) cal_amt,
MAX(t.Run_amt) Run_amt
FROM (
SELECT ID, Name, Amount,
MAX(CASE WHEN LAST_DAY(Date) = LAST_DAY(CURRENT_DATE) THEN cal_amt END)
OVER (PARTITION BY ID, Name, Amount ORDER BY Date DESC) cal_amt,
FIRST_VALUE(Run_amt) OVER (PARTITION BY ID, Name, Amount ORDER BY Date DESC) Run_amt
FROM tablename
) t
GROUP BY t.ID, t.Name, t.Amount
请参阅演示。
结果:
> ID | Name | Amount | cal_amt | Run_amt
> -: | :----- | -----: | ------: | ------:
> 1 | Test | 15000 | 12000 | 15000
> 2 | Test_1 | 18000 | 16000 | 25000
推荐阅读
- android - Kotlin - 基于选择在数据之间共享视图模型
- mysql - 我添加了一个 MySQL 数据库,现在从单独的 H2 数据库中检索测试失败。注释掉 MySQL 配置使测试通过
- r - 创建具有范围的列
- swift - 有没有办法在不使用 AppleScript 的情况下“单击”macOS 首选项窗格中的按钮?
- javascript - 使用 JavaScript 替换和增加列表组件
- javascript - 用 LI 元素替换 Hashtag
- c# - 如何在 UWP C# 应用程序上在 Windows 10 Mobile 和 PC 之间进行剪贴板同步?
- csv - dataweave 2.0 csv 转换
- sql-server - 我在 SQL Server 数据库中有两个表 - 用户和假期
- node.js - AWS lambda api Postgres 不会插入