MySQL- Выберите только одну соответствующую запись

#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. Пожалуйста, рассмотрите возможность удаления этого ответа, поскольку он не согласуется с фактически заданным вопросом.