Mysql 为别名​;标识字段中不同数据集的最后一行;纵队

Mysql 为别名​;标识字段中不同数据集的最后一行;纵队,mysql,sql,case,greatest-n-per-group,Mysql,Sql,Case,Greatest N Per Group,如何识别别名字段中不同数据集的最后一行​​列(以某种方式发送信号,例如“1”) 对于这个例子,我需要知道,订购的组“汽车、颜色、饮料、水果”何时结束 在此图像上检查我的预期结果: 我的基本查询: SELECT * FROM `MY_DB` ORDER BY `ITEM`, `GROUP` ASC 首先:SQL表的行是无序的。行没有固有的顺序。为了让你的问题有意义,你需要一个列来定义每个组中行的顺序——我假设id 然后:在MySQL 8.0中,有一个选项使用窗口函数: select t.*,

如何识别别名字段中不同数据集的最后一行​​列(以某种方式发送信号,例如“1”)

对于这个例子,我需要知道,订购的
“汽车、颜色、饮料、水果”何时结束

在此图像上检查我的预期结果:

我的基本查询:

SELECT * FROM `MY_DB` ORDER BY `ITEM`, `GROUP` ASC

首先:SQL表的行是无序的。行没有固有的顺序。为了让你的问题有意义,你需要一个列来定义每个组中行的顺序——我假设
id

然后:在MySQL 8.0中,有一个选项使用窗口函数:

select t.*,
    (row_number() over(partition by grp order by id desc) = 1) as last_group_flag
from mytable t
在早期版本中,可以使用子查询:

select t.*,
    (id = (select max(t1.id) from mytable t1 where t1.grp = t.grp)) as last_group_flag
from mytable t

注意:
group
是一个语言关键字,因此不是一个很好的列名选择。我在查询中使用了
grp

您需要按
列排序,按
组列
排序,以查找每个不同的
列的最后一条记录

使用
行号
,如下所示:

select t.*,
       Case when row_number() over(partition by group
                                   order by item desc) = 1 
            then 1 else 0 end as last_group_flag
from your_table t

谢谢。解决方案2)对我有效。解决方案1)不起作用:(@chameleon:welcome.
row_number()
需要MySQL 8.0,所以我想您运行的是早期版本。服务器版本:5.7.32-MySQL社区服务器(GPL);数据库客户端版本:libmysql-5.6.43;