检索按日期过滤的每个组中的最后一条记录-MySQL

时间:2018-11-29 20:03:31

标签: mysql sql

我需要从已经在另一个问题中解决的问题升级:Retrieving the last record in each group - 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中使用此查询,并只对日期进行一次调整,以检索正确的费率,然后再获取所需的特定费率。

如何简化上面的查询?

2 个答案:

答案 0 :(得分:2)

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

    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

答案 1 :(得分:1)

通常使用以下方法在每个组中找到最大的

C T