Оконные функции - отличный способ справиться с этим. Сложность использования оконной функции COUNT
заключается в том, что она не позволяет выполнить COUNT(DISTINCT ...)
. Поэтому, если у пользователя есть 2 подзадачи, он вернет 2, когда я предполагаю, что вы хотите, чтобы он возвратил 1.
Однако, мы могли бы использовать оконные функции MIN
и MAX
, чтобы увидеть, есть ли только один пользователь для задачи.
MIN([user]) OVER (PARTITION BY task)
получит «минимальное» пользовательское значение для задачи в наборе результатов. Аналогично, MAX
получит «максимум». Если они одинаковы, это означает, что для этой задачи есть только один пользователь, даже если у одного и того же пользователя несколько подзадач.
SELECT
task,
subtask,
[user],
CASE
WHEN MIN([user]) OVER (PARTITION BY task) = MAX([user]) OVER (PARTITION BY task)
THEN 'Individual ' + [user]
ELSE 'Team'
END
FROM Tasks
Без оконных функций это был бы подходящий способ сделать это также, что аналогично другим ответам, но я подумал, что включу это здесь, отметив, что он учитывает только отдельных пользователей.
SELECT
A.task,
A.subtask,
A.[user],
CASE
WHEN B.user_count = 1
THEN 'Individual ' + [user]
ELSE 'Team'
END
FROM Tasks A
INNER JOIN
(
SELECT
task,
COUNT(DISTINCT [user]) user_count
FROM #tmp
GROUP BY
task
) B
ON A.task = B.task
Так как вы планируете запустить это с довольно большой таблицей, возможно, будет полезно проверить оба решения на производительность.
Используйте Query.setParameterList()
, Javadoc здесь .
существует четыре варианта для выбора от.
Я не уверен в HQL, но в JPA Вы просто называете запрос setParameter
с параметром и набором.
Query q = entityManager.createQuery("SELECT p FROM Peron p WHERE name IN (:names)");
q.setParameter("names", names);
, где names
набор имен, Вы ищете
Collection<String> names = new ArrayList<String();
names.add("Joe");
names.add("Jane");
names.add("Bob");