SQL-запрос для сравнения записей, имеющих количество › 1

У меня есть временная таблица с именем Temp в подзапросе. В этой таблице у меня есть столбцы user_id, created_on и answer. Колонка ответов содержит только да или нет.

Я хотел бы:

найдите, есть ли у пользователя разные ответы для разных дат created_on, если это так, то сравните все эти ответы, чтобы узнать, отвечал ли когда-либо пользователь «да»

таблица, которая у меня есть, выглядит так:

| user_id | created_on | answer |

|       1 | 12/7/2016  | no     |

|       1 | 12/6/2016  | no     |

|       1 | 12/5/2016  | yes    |

|       2 | 11/30/2016 | no     |

|       2 | 11/29/2016 | no     |

|       3 | 10/1/2016  | yes    |

|       4 | 9/2/2016   | no     |

Вывод должен выглядеть так:

| user_id | final_answer |

|    1    |     yes      |

|    2    |     no       |

|    3    |     yes      |

|    4    |     no       |

Я могу подумать о Self Join, чтобы решить эту проблему, но бывают случаи, когда количество user_id равно 10. Для случаев, когда есть только одна запись user_id, вывод должен возвращать только эту единственную запись из столбца ответа. Как решить эту проблему с помощью SQL-запроса?


person Sravee    schedule 07.12.2016    source источник
comment
Если я правильно понимаю ваш вопрос, вам нужен только окончательный ответ, который пользователь дает на любой заданный вопрос. Сначала я бы сделал группу по идентификатору пользователя, идентификатору вопроса и выбрал максимальную дату для каждого идентификатора пользователя/вопроса. Установив самую новую дату для каждого идентификатора пользователя/идентификатора вопроса, затем выполните соединение с основной таблицей, где совпадают даты идентификатора пользователя/вопроса и максимальные даты.   -  person mba12    schedule 07.12.2016
comment
@ mba12 прислушивается к объяснению. но я хочу сравнить ответы для конкретного пользователя, и если он когда-либо отвечал «да», то последний столбец должен содержать «да». По сути, дата создания не имеет значения, я просто использую ее для перечисления различных ответов.   -  person Sravee    schedule 07.12.2016


Ответы (1)


Попробуй это. Присвойте 1 или 0 в зависимости от того, ответили ли они да или нет. Возьмите сумму этого. Если он больше 0, это означает, что в какой-то момент они должны были ответить «да».

SELECT 
  user_id,
  CASE 
    WHEN(SUM(CASE WHEN answer = 'yes' THEN 1 ELSE 0 END)) > 0 THEN 'yes' 
    ELSE 'no' 
  END AS final_answer
FROM
  YourTempTable
GROUP BY user_id
person SQLChao    schedule 07.12.2016
comment
Вы также захотите убедиться, что нет никаких других значений, кроме yes или no. Приведенный выше код присвоит 0 всему, что не является «да». @sravee - person SQLChao; 07.12.2016
comment
Да, в моем случае ответы только да или нет. Но гипотетически, если бы у меня было 7 разных ответов, мне пришлось бы играть со счетом, верно? - person Sravee; 07.12.2016
comment
Если бы у вас было 7 разных ответов, но вас интересует только yes, логика не изменилась бы. Установите все ответы, которые не являются да, равными 0. - person SQLChao; 07.12.2016
comment
Я имел в виду ответы не в форме или "да" или "нет". Скажем, например, ответы представляют собой 7 различных чисел, которые пользователь может выбрать. - person Sravee; 07.12.2016