ВЫБЕРИТЕ столбец не в предложении GROUP BY - PullRequest
8 голосов
/ 30 июня 2019

Я пытаюсь написать запрос, который бы выбирал только те строки, в которых есть события, которые были бы единственными событиями в этом году.

Например:

Year   Event
2011     A
2011     B
2012     C
2013     B
2013     D
2014     D

Итак, я быхотел бы получить строки 2012 C и 2014 D в результатах.Я попытался сделать GROUP BY на Year, но это не позволило мне выбрать столбец Event.В 2011 и 2013 годах есть 2 события, поэтому их не должно быть в результатах.

Пожалуйста, помогите.

РЕДАКТИРОВАТЬ: я мог бы написать вложенный запрос, чтобы получить только строки, имеющие count(Year) = 1с GROUP BY Year, но мне не удается выбрать столбец Event во внешнем запросе

SELECT Year, Event from table where Year in (SELECT Year from table GROUP BY Year Having count(*) = 1) as count;

Ответы [ 5 ]

5 голосов
/ 30 июня 2019

Нет необходимости использовать подзапрос или вложенный запрос.Вы можете просто сгруппировать поле Year и использовать HAVING COUNT(Year)=1, чтобы найти необходимые строки.Таким образом, применимым запросом будет:

SELECT Year, Event
FROM table_name
GROUP BY Year
HAVING COUNT(Year)=1

Образец исполняемого решения можно найти по адресу:

http://sqlfiddle.com/#!9/b47044/11

Логика: КогдаВы группируете по Year, он объединяет все строки с одинаковым годом.Таким образом, количество будет 2 для 2011.

Вы можете проверить это, выполнив:

SELECT Year, Event, COUNT(Year) as event_count
FROM table_name
GROUP BY Year

Вы можете увидеть этот промежуточный шаг в выполнении по адресу: http://sqlfiddle.com/#!9/b47044/10

Это решение выше будет толькоработа для версии MySQL <5.7.Для более высоких версий найдите решение ниже. </strong>

Для версии 5.7 и выше режим SQL ONLY_FULL_GROUP_BY включен по умолчанию, поэтому это не удастся.Либо вы можете обновить этот режим (см. Ответы в Список SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец .... несовместим с sql_mode = only_full_group_by ), либо вы можете использовать функцию ANY_VALUE() для ссылки нанеагрегированный столбец, поэтому запрос на обновление, который будет работать в MySQL 5.7 и более поздних версиях:

SELECT Year, ANY_VALUE(Event)
FROM table_name
GROUP BY Year
HAVING COUNT(Year)=1;

Пример исполняемого файла можно найти по адресу: https://paiza.io/projects/e/tU-7cUoy3hQUk2A7tFfVJg

Ссылка: https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/miscellaneous-functions.html#function_any-value

2 голосов
/ 30 июня 2019

Необходимо отфильтровать только те года и события, которые содержат одно событие, которое год

  1. Внутренний запрос даст вам только годы, которые имеют одно событие
  2. Внешний запрос будетвыберите события тех лет
SELECT Year, Event from table where Year in 
(SELECT Year from table GROUP BY Year Having count(*) = 1);
2 голосов
/ 30 июня 2019

У вас есть небольшая ошибка в запросе, count(*), который используется в условии, также должен быть в предложении select

SELECT Year, Event from table where Year in ( SELECT Year from ( SELECT Year,count(*) from table GROUP BY Year Having count(*) = 1)temp );

1 голос
/ 30 июня 2019

Хороший вопрос,

Вам даже не нужен подзапрос, чтобы получить желаемый результат. Объедините все имена событий в одну строку, затем найдите запятую , в строке. Если запятая , найдена, в этом году будет более одного события, в противном случае только одно.

   SELECT Year, GROUP_CONCAT(Event) AS Event FROM Events GROUP BY (year) having 
   INSTR(Event, ",") = 0;
0 голосов
/ 30 июня 2019
SELECT Year, Event 
FROM table 
WHERE Year in (SELECT Year 
               FROM table 
               GROUP BY Year 
               HAVING count(*) = 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...