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