检索每个组中的最后一条记录按日期筛选-mysql

g9icjywg  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(255)

我需要从另一个问题中解决的问题升级:检索每个组中的最后一条记录-mysql
我的问题很相似,但我不能达到我需要的结果。
在我的第一张table上 VAT_types 我用他们的名字来定义什么样的价格

id   type
--------------
1    ordinaria
2    ridotta
3    minima
4    esente

在我的第二张table上 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(),它将显示该日期之前所有可用的费率。
现在我想按vat类型对它们进行分组,只检索最后更新的一个。所以我在这里查了一下,发现上面有一个链接的解决方案,我做了如下调整:

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中使用这个查询并调整日期一次,以便检索正确的费率和所需的具体费率。
如何简化上述查询?
fhg3lkii

fhg3lkii1#

您可以在子查询中使用按类型划分的最大日期组的内部联接

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
rfbsl7qr

rfbsl7qr2#

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

select VAT.id, TYPE.type, VAT.date, VAT.rate
from VAT_rates VAT
join VAT_types TYPE on VAT.type = TYPE.id
join
(
    select type, max(date) max_date
    from VAT_rates 
    where cast(date as date) <= cast("2022-11-22" as date)
    group by type
) t on VAT.type = t.type and
       VAT.date = t.max_date and 
       cast(VAT.date as date) <= cast("2022-11-22" as date)

相关问题