GROUP BY с несколькими столбцами и LIMIT 2? - PullRequest
1 голос
/ 15 апреля 2020

В моей базе данных 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, чтобы получить маленький и большой бренд на цвет?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Чтобы произвольно выбрать одну строку для цвета, марки и размера, используйте 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;
0 голосов
/ 15 апреля 2020

Спасибо @Nick и всем остальным. Это сработало для меня:

SELECT color, brand, size, otherstuff1, otherstuff2, otherstuff3 FROM [table] GROUP BY color, brand, size ORDER BY color, brand, size

Спасибо

...