[英]How to group rows in MySQL with condition
I have this table:我有这张桌子:
| id | part number | serial_number | qty |
==========================================
| 1 | A | 12345 | 1 |
| 2 | A | 54321 | 1 |
| 3 | A | 67890 | 1 |
| 4 | B | | 10 |
| 5 | B | | 5 |
| 6 | C | | 6 |
| 7 | C | | 3 |
I want to group the rows like this:我想像这样对行进行分组:
| id | part number | serial_number | qty |
==========================================
| 1 | A | 12345 | 1 |
| 2 | A | 54321 | 1 |
| 3 | A | 67890 | 1 |
| 4 | B | | 10 |
| 6 | C | | 6 |
How to do this?这该怎么做? Is this possible or not?
这可能吗?
I want group the row by part number that doesn't have serial number.我想按没有序列号的零件号对行进行分组。 So if I have 4 rows with same part number that doesn't have serial number, it's only display 1 row.
因此,如果我有 4 行具有相同部件号但没有序列号,则只显示 1 行。
This looks like you just want to aggregate by the combination of the part number
and serial_number
, taking the max quantity:看起来您只想通过
part number
和serial_number
的组合进行聚合,取最大数量:
SELECT
MIN(t1.id) AS id, t1.part_number, t1.serial_number, t1.qty
FROM yourTable t1
INNER JOIN
(
SELECT part_number, serial_number, MAX(qty) AS qty
FROM yourTable
GROUP BY part_number, serial_number
) t2
ON t1.part_number = t2.part_number AND
(t1.serial_number = t2.serial_number OR
t1.serial_number IS NULL AND t2.serial_number IS NULL) AND
t1.qty = t2.qty
GROUP BY
t1.part_number,
t1.serial_number,
t1.qty
ORDER BY
MIN(t1.id);
Note that null
is a legitimate value to form a member of a group in a GROUP BY
operation.请注意,
null
是在GROUP BY
操作中形成组成员的合法值。
This looks more like a job for NOT EXISTS
.这看起来更像是
NOT EXISTS
的工作。
For those that have a NULL serial_number you want only to keep those with the lowest id per part_number.对于那些具有 NULL serial_number 的人,您只想保留那些每个 part_number 具有最低 id 的人。
So you just need to filter those you don't need.所以你只需要过滤那些你不需要的。
SELECT *
FROM YourTable t
WHERE NOT EXISTS
(
SELECT 1
FROM YourTable d
WHERE d.`part number` = t.`part number`
AND d.serial_number IS NULL
AND t.serial_number IS NULL
AND d.id < t.id
)
ORDER BY id;
Result:结果:
id | part number | serial_number | qty
-- | ----------- | ------------- | ---
1 | A | 12345 | 1
2 | A | 54321 | 1
3 | A | 67890 | 1
4 | B | null | 10
6 | C | null | 6
Test on db<>fiddle here在这里测试db<>fiddle
Btw, in MySql 5.x, when the ONLY_FULL_GROUP_BY setting isn't active.顺便说一句,在 MySql 5.x 中,当 ONLY_FULL_GROUP_BY 设置未激活时。
Then this would give the same result.那么这将给出相同的结果。
But then it won't only be for those with NULL serial_number.但它不仅适用于那些序列号为 NULL 的人。
SELECT *
FROM YourTable
GROUP BY `part number`, serial_number
ORDER BY id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.