#mysql
#mysql
Вопрос:
У меня есть таблица, которая имеет свой первичный ключ в виде комбинации из 4 столбцов column_1, column_2, column_3, column_4
. В этой таблице есть несколько записей, которые имеют несколько значений для одной и той же комбинации <column_1, column_2>
значений. Я хочу написать SQL-запрос, чтобы выбрать различные комбинации column_1 и column_2 с любой случайной комбинацией column_3 и column_4.
Пример: Таблица
column_1 column_2 column_3 column_4
column_1_value_1 column_2_value_1 2000 america
column_1_value_1 column_2_value_1 1000 europe
column_1_value_2 column_2_value_2 3000 asia
Я хочу, чтобы результат был
column_1_value_1 column_2_value_1 2000 america
column_1_value_2 column_2_value_2 3000 asia
или
column_1_value_1 column_2_value_1 1000 europe
column_1_value_2 column_2_value_2 3000 asia
Я попробовал запрос select column_1, column_2, max(column_3), max(column_4) from table group by column_1, column_2
, но это обеспечивает вывод:
column_1_value_1 column_2_value_1 2000 europe
column_1_value_2 column_2_value_2 3000 asia
Этот вывод неверен, потому что значение column_3 2000
не совпадает со значением column_4 europe
.
Может кто-нибудь, пожалуйста, помочь мне сформулировать запрос в соответствии с моим требованием?
Комментарии:
1. » ВЫБЕРИТЕ * ИЗ
table_name
ГРУППЫ по столбцу_1, столбцу_2 » почему вы использовали max для столбца_3 и столбца_4, есть и особые требования. Я просто запускаю приведенный выше запрос и его вывод, как вы хотите.2. max так же хорош, как получение случайного значения из столбца, поэтому я использовал max.
3. @bhargavkatakpara Вы выбираете все столбцы, но группируете только по выбранным столбцам. На мой взгляд, это концептуально неверно
4. Хорошо, @sagar понял вашу точку зрения.
Ответ №1:
Мы можем использовать ROW_NUMBER
здесь для опции MySQL 8 :
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY column_1, column_2 ORDER BY RAND()) rn
FROM yourTable
)
SELECT column_1, column_2, column_3, column_4
FROM cte
WHERE rn = 1;
Решение, включающее объединения и избегающее аналитических функций, может выглядеть следующим образом:
SELECT t1.column_1, t1.column_2, t1.column_3, t1.column_4
FROM yourTable t1
INNER JOIN
(
SELECT column_1, column_2, MAX(column_3) AS max_column_3
FROM yourTable
GROUP BY column_1, column_2
) t2
ON t1.column_1 = t2.column_1 AND
t1.column_2 = t2.column_2 AND
t1.column_3 = t2.max_column_3;
Этот второй подход произвольно выбирает (column_1, column_2)
единственную запись как ту, которая имеет наибольшее значение для column_3
.
Комментарии:
1. Спасибо за ответ, Тим. Не могли бы вы предоставить мне решение с простым синтаксисом SQL? Я в порядке, если это связано с объединением таблицы с самой собой
2. Проверьте обновленный ответ, который соответствует тому, что вы пытались сделать изначально.
3. Я только что понял, что это может не сработать, если есть несколько записей с одинаковым значением для Column_1, Columns_2, Column_3. Опубликовал небольшое изменение вашего решения в качестве ответа
Ответ №2:
Небольшая модификация ответа, опубликованного Тимом.
SELECT t1.column_1, t1.column_2, t1.column_3, max(t1.column_4)
FROM yourTable t1
INNER JOIN
(
SELECT column_1, column_2, MAX(column_3) AS max_column_3
FROM yourTable
GROUP BY column_1, column_2
) t2
ON t1.column_1 = t2.column_1 AND
t1.column_2 = t2.column_2 AND
t1.column_3 = t2.max_column_3
GROUP BY t1.column_1, t1.column_2, t1.column_3;
Комментарии:
1. Пожалуйста, рассмотрите возможность удаления этого ответа, поскольку он не согласуется с фактически заданным вопросом.