【问题标题】:Retrieving the last record in each group not getting expected result - MySQL检索每个组中的最后一条记录没有得到预期的结果 - MySQL
【发布时间】:2023-03-08 09:24:02
【问题描述】:

我想从表中获取每个类别最近两个月的数据。

表格如下:

ID 年 月 类别 价值
1 2019 1 测试1 10
2 2018 12 测试1 10
3 2018 10 测试1 10
4 2018 1 测试2 10
5 2018 12 测试2 10
6 2018 1 测试3 10


预期输出:

ID 年 月 类别 价值
1 2019 1 测试1 10
2 2018 12 测试1 10
5 2018 12 测试2 10
4 2018 1 测试2 10
6 2018 1 测试3 10


我尝试使用:

SELECT a.year,a.month,a.value, a.category
FROM test_data AS a
WHERE 
(
SELECT COUNT(*)
FROM test_data AS b
WHERE b.category = a.category AND (b.year >= a.year AND b.month >= a.month)) <= 2
ORDER BY a.year DESC, a.month DESC

但它给出了 TEST1 类别的额外记录。我猜是因为它在年度条件下没有按预期工作。请为此提供解决方案

【问题讨论】:

    标签: php mysql date select greatest-n-per-group


    【解决方案1】:

    您的首要工作应该是修复您的数据模型并使用类似date 的数据类型来存储日期信息,而不是将其分散到不同的列中。这应该就像向表中添加一个新列并从现有列更新它一样简单:

    alter table test_data add mydate date;
    update test_data set mydate = concat(year, '-', month, '-01');
    

    也就是说,要使您当前的查询正常工作,您需要对日期的条件进行微调,如下所示。一种选择使用算术:

    SELECT a.year, a.month, a.value, a.category
    FROM test_data AS a
    WHERE (
        SELECT COUNT(*)
        FROM test_data AS b
        WHERE 
            b.category = a.category 
            AND 100 * b.year + b.month >= 100 * a.year + a.month
    ) <= 2
    ORDER BY a.year DESC, a.month DESC
    

    或者,如果您运行的是 MySQL 8.0,您可以使用row_number()

    SELECT  a.year, a.month, a.value, a.category
    FROM (
        SELECT 
            a.*,
            ROW_NUMBER() OVER(PARTITION BY a.category ORDER BY a.year DESC, a.month DESC)
        FROM test_data AS a 
    ) a
    WHERE rn <= 2
    

    【讨论】:

      猜你喜欢
      • 2010-11-21
      相关资源
      最近更新 更多