mysql - 检索按日期过滤的每个组中的最后一条记录 - MySQL
问题描述
我需要从另一个问题中已经解决的问题升级:检索每个组中的最后一条记录 - MySQL
我的问题非常相似,但我无法达到我需要的结果。
在我的第一个表中VAT_types
,我通过名称定义了可用的费率类型
id type
--------------
1 ordinaria
2 ridotta
3 minima
4 esente
在我的第二张表中VAT_rates
,我有多个增值税税率,具体取决于法律何时将其正式化,这些税率将不时更新,但所有税率的记录必须始终可用
id date type rate
-----------------------------
1 2013-01-01 1 22.0000
2 2013-01-01 2 10.0000
3 2013-01-01 3 4.0000
4 2000-01-01 4 0.0000
9 2019-01-01 2 11.5000
10 2021-01-01 2 12.0000
11 2019-01-01 1 24.2000
12 2021-01-01 1 25.0000
因此,如果我想根据当前日期(或未来日期)过滤它们,我只需像这样查询它们:
SELECT VAT.id, TYPE.type, VAT.date, VAT.rate
FROM VAT_rates VAT JOIN VAT_types TYPE on TYPE.id = VAT.type
WHERE cast(VAT.date as date) <= cast("2022-11-22" as date)
ORDER BY VAT.type ASC, VAT.date DESC
"2022-11-22"
可以是任何日期,事实上,如果我将其更改为 CURDATE(),它将显示该日期之前的所有可用费率。
现在我想按大桶类型对它们进行分组并仅检索最后更新的一个。因此,我在这里查找并发现上面链接的解决方案,我对其进行了如下调整:
SELECT T1.*
FROM (
SELECT VAT.id, TYPE.type, VAT.date, VAT.rate
FROM VAT_rates VAT JOIN VAT_types TYPE on TYPE.id = VAT.type
WHERE cast(VAT.date as date) <= cast("2022-11-22" as date)
ORDER BY VAT.type ASC, VAT.date DESC
) T1
LEFT JOIN (
SELECT VAT.id, TYPE.type, VAT.date, VAT.rate
FROM VAT_rates VAT JOIN VAT_types TYPE on TYPE.id = VAT.type
WHERE cast(VAT.date as date) <= cast("2022-11-22" as date)
ORDER BY VAT.type ASC, VAT.date DESC
) T2
ON (T1.type = T2.type AND T1.id < T2.id)
WHERE T2.id IS NULL
ORDER BY T1.rate DESC;
结果将是:
id type date rate
--------------------------------
12 Ordinaria 2021-01-01 25,0000
10 Ridotta 2021-01-01 12,0000
3 Minima 2013-01-01 4,0000
4 Esente 2000-01-01 0,0000
它似乎有效,但当然它太复杂了。我还希望在我的 php 中使用此查询并仅调整一次日期以检索正确的费率,然后检索所需的特定费率。
如何简化上面的查询?
解决方案
您可以按类型对子查询使用内部联接来获取最大日期组
select VAT.id, TYPE.type, VAT.date, VAT.rate
from VAT_rates VAT
inner JOIN VAT_types TYPE on TYPE.id = VAT.type
inner join (
select max(VAT.date) max_date, TYPE.type
from VAT_rates VAT
INNER JOIN VAT_types TYPE on TYPE.id = VAT.type
WHERE str_to_date(VAT.date, '%Y-%m-%d') <= str_to_date("2022-11-22", '%Y-%m-%d')
group by TYPE.type
) T on T.max_date = VAT.date and T.type = TYPE.type
推荐阅读
- python - 使用指定用于颜色条的列的函数绘制 Excel 数据
- java - Maven JAXB2 插件无法处理绑定文件
- git - git checkout 不删除未跟踪的文件
- android - 如何在 Android Surface 上使用 libav 获得更好的质量?
- php - flashdata 在 codeigniter 中根本不起作用
- java - html5表单提交发送日期与模式yyyy-MM-dd
- weblogic12c - Weblogic WLST 获取部署状态
- hibernate - SpringBoot @RestController 不止一个 @Transactional 方法
- android - 为什么 GestureDetector 不能正常工作?
- python - matplotlib 的绘图风格