获取没有 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 的最高订单号。但是您随后可以轻松地比较 order
和 last
列以创建您的 last
和 not_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_NUMBER
window函数为该列分配一个序数值一种后代方式,以便您的最大值排名 = 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.
所以我有这个 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 的最高订单号。但是您随后可以轻松地比较 order
和 last
列以创建您的 last
和 not_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_NUMBER
window函数为该列分配一个序数值一种后代方式,以便您的最大值排名 = 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.