获取没有 id 的 table 的最高值行

Get the top value row of a table without id

所以我有这个 table:

req_num number status order
1254 5 7 1
1254 4 7 2
1254 6 7 3
1246 7 8 1
1246 5 8 2
1246 3 8 3
1253 1 9 1
1253 4 7 2
1253 7 4 3
1321 7 4 1
1321 8 4 2
1321 7 4 3
1321 8 4 4

而且我需要知道是否有一种方法可以生成一个查询,该查询会根据“订单”列中的最大值生成这样的列。

req_num number status order last_req
1254 5 7 1 not_last
1254 4 7 2 not_last
1254 6 7 3 last
1246 7 8 1 not_last
1246 5 8 2 not_last
1246 3 8 3 last
1253 1 9 1 not_last
1253 4 7 2 not_last
1253 7 4 3 last
1321 7 4 1 not_last
1321 8 4 2 not_last
1321 7 4 3 not_last
1321 8 4 4 last

这个 table 没有任何 ID,我不能在上面插入,有什么想法吗?

您可以使用 window 函数来完成此操作 - 您可以按 req_num 对数据进行分区,然后在每个分区中取出具有最高 order 的项目。

文档:https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html

结果将类似于(未测试):

SELECT rec_num, number, status, LAST_VAL(order) OVER w AS 'last',
FROM my_table
WINDOW w AS (PARTITION BY req_num ORDER BY order);

这不会为您提供您想要的内容,因为所有行现在都将包含该 rec_num 的最高订单号。但是您随后可以轻松地比较 orderlast 列以创建您的 lastnot_last 标识符。

SELECT rec_num, number, status, LAST_VAL(order) OVER w AS 'last',
    IF(`order` = `last`, 'last', 'not_last') AS last_req
FROM my_table
WINDOW w AS (PARTITION BY req_num ORDER BY order);

window 函数在这种情况下非常强大。

为了解决这个问题,需要在order字段中寻找最大值,按req_num分组。

如果您的版本是MySQL8.0,您可以使用ROW_NUMBERwindow函数为该列分配一个序数值一种后代方式,以便您的最大值排名 = 1。之后,您使用 IF 语句检查您的列是否具有值 1,并相应地替换为 'last' 和 'not_last' .

SELECT tab.req_num,
       tab.status,
       tab.order,
       IF(max_values.max_order, 'last', 'not_last') AS last_req
FROM      tab 
LEFT JOIN (SELECT req_num,
                  MAX(order) AS max_order
           FROM tab
           GROUP BY req_num                ) max_values
       ON tab.req_num = max_values.req_num
      AND tab.order = max_values.max_order

演示 here.


如果你的版本是MySQL5.X,你可以先在只包含[=16的子查询中使用MAX聚合函数=] 和 order,通过在前一个字段上分组并在后一个字段上聚合。然后你可以用这个结果集 LEFT JOIN 原始的 table ,并且将分配 NULL 的 order 值将是 'not_last'.

SELECT tab.req_num,
       tab.status,
       tab.order,
       IF(max_values.max_order, 'last', 'not_last') AS last_req
FROM      tab 
LEFT JOIN (SELECT req_num_,
                  MAX(order) AS max_order
           FROM tab
           GROUP BY req_num               ) max_values
       ON tab.req_num = max_values.req_num
      AND tab.order = max_values.max_order

演示 here.