首页 > 解决方案 > 具有多个列和 LIMIT 2 的 GROUP BY?

问题描述

我的 mysql 数据库中有以下数据结构:

+-------+----------+-------+------------+-------------+-------------+
| Color |  brand   | size  | otherstuff | otherstuff2 | otherstuff3 |
+-------+----------+-------+------------+-------------+-------------+
| red   | BMW      | small | 0,69       | 0,22        | 0,36        |
| red   | BMW      | big   | 0,48       | 0,00        | 0,13        |
| red   | Ford     | small | 0,42       | 0,33        | 0,81        |
| red   | BMW      | big   | 0,99       | 0,66        | 0,27        |
| red   | Ford     | big   | 0,30       | 0,44        | 0,23        |
| red   | Mercedes | small | 0,87       | 0,23        | 0,80        |
| red   | Mercedes | big   | 0,51       | 0,06        | 0,46        |
| blue  | BMW      | small | 0,07       | 0,53        | 0,99        |
| blue  | BMW      | small | 0,57       | 0,45        | 0,45        |
| blue  | BMW      | big   | 0,14       | 0,23        | 0,37        |
| blue  | Ford     | big   | 0,83       | 0,14        | 0,20        |
| blue  | Ford     | big   | 0,20       | 0,10        | 0,60        |
| blue  | Mercedes | small | 0,58       | 0,90        | 0,90        |
| blue  | BMW      | small | 0,12       | 0,41        | 0,40        |
| blue  | Mercedes | big   | 0,81       | 0,57        | 0,79        |
| blue  | Mercedes | big   | 0,95       | 0,36        | 0,70        |
| green | Ford     | big   | 0,09       | 0,56        | 0,90        |
| green | Ford     | small | 0,54       | 0,03        | 0,99        |
| green | Ford     | small | 0,86       | 0,58        | 0,12        |
| green | BMW      | small | 0,88       | 0,39        | 0,91        |
| green | BMW      | small | 0,39       | 0,92        | 0,50        |
| green | BMW      | big   | 0,11       | 0,62        | 0,23        |
+-------+----------+-------+------------+-------------+-------------+

我想收到每种颜色和每种品牌一个大尺寸和一个小尺寸行 - 像这样:

+-------+----------+-------+------------+-------------+-------------+
| Color |  brand   | size  | otherstuff | otherstuff2 | otherstuff3 |
+-------+----------+-------+------------+-------------+-------------+
| red   | BMW      | small | 0,69       | 0,22        | 0,36        |
| red   | BMW      | big   | 0,48       | 0,00        | 0,13        |
| red   | Ford     | small | 0,42       | 0,33        | 0,81        |
| red   | Ford     | big   | 0,30       | 0,44        | 0,23        |
| red   | Mercedes | small | 0,87       | 0,23        | 0,80        |
| red   | Mercedes | big   | 0,51       | 0,06        | 0,46        |
| blue  | BMW      | small | 0,57       | 0,45        | 0,45        |
| blue  | BMW      | big   | 0,14       | 0,23        | 0,37        |
| blue  | Ford     | big   | 0,20       | 0,10        | 0,60        |
| blue  | Mercedes | big   | 0,81       | 0,57        | 0,79        |
| blue  | Mercedes | small | 0,58       | 0,90        | 0,90        |
| green | Ford     | big   | 0,09       | 0,56        | 0,90        |
| green | Ford     | small | 0,54       | 0,03        | 0,99        |
| green | BMW      | small | 0,39       | 0,92        | 0,50        |
| green | BMW      | big   | 0,11       | 0,62        | 0,23        |
+-------+----------+-------+------------+-------------+-------------+

我的 SQL:

SELECT * FROM `table` GROUP BY color

每种颜色都有一个小品牌和一个大品牌,我的 SQL 看起来像什么?

标签: sqlmariadbmariadb-10.4

解决方案


要任意选择每种颜色、品牌和尺寸的一行,请使用ROW_NUMBER

SELECT color, brand, size, otherstuff, otherstuff2, otherstuff3
FROM
(
  SELECT
    t.*,
    ROW_NUMBER() OVER (PARTITION BY color, brand, size ORDER BY otherstuff) AS rn
  FROM mytable t
) numbered
WHERE rn = 1
ORDER BY color, brand, size;

推荐阅读