Отличный sql в зависимости от состояния Более двух столбцов - PullRequest
0 голосов
/ 20 декабря 2018

Ниже приведена структура таблицы.Первый столбец содержит строки, которые могут присутствовать в нескольких строках.Я хочу написать запрос таким образом, что значение column1 повторяется только один раз, так что строка, где column2 содержит A, имеет приоритет.Если доступен только B, выведите то же самое.Также с этим должен быть напечатан связанный столбец3.В тех случаях, когда в столбцах Column1 и Column2 имеется более одной строки с одинаковыми значениями, выберите любую (например, строки 2 и 3 ниже).

Образцы данных приведены ниже и ожидаемый результат sql.

Структура таблицы (есть и другие столбцы, которые здесь пропущены)

Column1 Column2 Column3
 123       A       1
 234       A       1
 234       A       4
 234       B       2
 435       A       2
 536       B       1

Ожидаемый результат SQL

Column1 Column2 Column3
 123       A      1
 234       A      1
 435       A      2
 536       B      1

Примечание. Это расширение этого вопроса Отличный sql в зависимости от состояния

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Я думаю, что коррелированный подзапрос - самый простой подход:

select t.*
from t
where (t.column2, t.column3) =
       (select column2, column3
        from t t2
        where t2.column1 = t.column1
        order by (column2 = 'A') desc  -- put "A" first
        limit 1
       );
0 голосов
/ 20 декабря 2018

Поскольку ваша версия MySQL 8.0, мы можем использовать функциональность Row_Number().Мы можем определить значения Row_Number() в пределах раздела значений Column1, причем номер строки 1 соответствует минимальному значению Column2 в разделе.Это также будет обрабатывать случай, когда есть несколько строк с одинаковым минимальным значением Column2, и он выберет любую из них.

Затем мы можем использовать этот набор результатов в Производная таблица и получить строки, в которых номер строки равен 1.

SELECT
  dt.Column1, dt.Column2, dt.Column3
FROM 
(
  SELECT
    Column1, Column2, Column3, 
    ROW_NUMBER() OVER (PARTITION BY Column1 
                       ORDER BY Column2 ASC) AS rowno 
  FROM your_table
) AS dt 
WHERE dt.rowno = 1
0 голосов
/ 20 декабря 2018

Вы можете попробовать это:

SELECT   tab.Column1,
         tab.Column2,
         MIN(tab.Column3)
FROM     (SELECT Column1,
                 MIN(Column2) as min_column2
          FROM   tab
          GROUP BY Column1
         ) t
JOIN     tab
  ON     tab.Column1 = t.Column1
 AND     tab.Column2 = t.min_column2
GROUP BY tab.Column1,
         tab.Column2;

Это простой ANSI-SQL и не зависит от вашей БД или ее версии.

0 голосов
/ 20 декабря 2018

Вы можете попробовать

select distinct column1, column2, column3
from tableName
order by column1

Я уверен, что это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...