首页 > 解决方案 > 检索按日期过滤的每个组中的最后一条记录 - 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 中使用此查询并仅调整一次日期以检索正确的费率,然后检索所需的特定费率。

如何简化上面的查询?

标签: mysqlsql

解决方案


您可以按类型对子查询使用内部联接来获取最大日期组

    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

推荐阅读