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
Ако разбирам правилно въпроса ви, вие искате само крайния отговор, който потребителят предоставя за даден въпрос. Първо бих направил група по потребителски идентификатор, идентификатор на въпрос и бих избрал максималната дата за всеки userid/questionid. След като установите най-новата дата за всеки userid/questionid, след това направете съединяване с основната таблица, където userid/questionid и максималните дати съвпадат.   -  person mba12    schedule 07.12.2016
comment
@mba12 applogies за обяснението. но искам да сравня отговорите за конкретен потребител и ако той/тя някога е отговорил с „да“, тогава последната колона трябва да съдържа „да“. По същество датата на createn_on няма значение, просто я използвам, за да изброя различните отговори   -  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
Също така ще искате да сте сигурни, че няма други стойности освен да или не. Горният код ще присвои 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