按最新日期获取分组后的列

Posted

技术标签:

【中文标题】按最新日期获取分组后的列【英文标题】:Get column after group by lastest date 【发布时间】:2021-04-01 02:46:34 【问题描述】:

请帮我从表 1 中得到表 2

【问题讨论】:

您能否详细说明这个问题?图片并不总是一个好主意。 结果毫无意义。为什么要为第一个代码设置 second 值? 在code1 = 1的组中,我有4条记录,然后我分组计数等于4,在4条记录中,我会选择日期最新的记录,它是16/2 = > code2 是 BBBBB code1 的最晚日期是 20/2,code2 的最晚日期是 21/1 请重新查看您的图片 【参考方案1】:

使用GROUP BY可以实现简单的总结

select
      code1
    , max(code2)  as code2
    , count(*)    as times
    , max(`date`) as max_dt
from table1
group by
     code1

但结果与图片不同:

+-------+-------+-------+------------+
| code1 | code2 | times |   max_dt   |
+-------+-------+-------+------------+
|     1 | D     |     4 | 2020-02-21 |
|     2 | NNNN  |     2 | 2021-01-21 |
+-------+-------+-------+------------+

注意:

    code2 的最大值可能不是您所期望的。例如“D”在“BBBBB”之后,因为数据是按字母顺序排列的。不是基于字符串的长度。 code1 的最大日期不是 16/2 我不建议将任何列命名为“日期”,因为它通常是保留字,可能会在开发查询时造成困难。

对于版本 8 之前的 mysql,可以使用以下技术来获取“最新”行:

SELECT code1, code2, `date`
    , (select count(*) from mytable t2 where d.code1 = t2.code1) as times
FROM (
        SELECT
              @row_num :=IF(@prev_value = t.code1, @row_num + 1, 1) AS rn
            , t.code1
            , t.code2
            , t.`date`
            , @prev_value := t.code1
        FROM mytable t
        CROSS JOIN (SELECT @row_num :=1,  @prev_value :='') vars
        ORDER BY
              t.code1
            , t.`date` DESC
    ) as d
WHERE rn = 1
;

或者,对于 MySQL 8 或更高版本,可以使用更简单的查询,因为通过over() 子句可以使用窗口函数:

SELECT code1, code2, `date`, times
FROM (
        SELECT
              row_number() over(partition by t.code1
                                order by t.`date` DESC) AS rn
            , t.code1
            , t.code2
            , t.`date`
            , count(*) over(partition by t.code1) as times
        FROM mytable t
    ) as d
WHERE rn = 1
;

第二次和第三次查询的结果是一样的:

+-------+-------+------------+-------+
| code1 | code2 |    date    | times |
+-------+-------+------------+-------+
|     1 | D     | 2020-02-21 |     4 |
|     2 | NNNN  | 2021-01-21 |     2 |
+-------+-------+------------+-------+

在 dbfiddle here

演示的解决方案

【讨论】:

这意味着我想得到日期是组中最新的code2 这些是应该在您的问题中解释的事实!我们无法猜测您的想法。但是,请注意,code1=1 组中的最晚日期不是 16/2。另外:什么版本的 MySQL? 这很重要 我添加了 2 个变体,它们为每个 code1 获取与“最新日期”相关的行,但结果再次不同,因为 code1 的最新日期不是 16/2

以上是关于按最新日期获取分组后的列的主要内容,如果未能解决你的问题,请参考以下文章

分组日期滚动中最新非空值的 Pandas 日期索引

Pandas - 按字段分组并使用显示该字段数量的列

MySQL 按 ID 和最新日期时间分组

SQL - 按电子邮件和最新日期分组

如何通过为每个单独的列列出分组后的所有数据并求和

获取分组中最新日期的行