Другим вариантом является создание производной таблицы (в виде CTE или встроенной), которая подсчитывает количество пользователей на задачу. Затем вы можете использовать это, чтобы показать нужную группу (очень похоже на ответ @ Squirrel, просто заменив оконную функцию производным набором записей).
WITH
TasksGroupedByUser(Task, UserCount) AS
(
SELECT Task, COUNT(DISTINCT [User])
FROM Tasks
GROUP BY Task
)
SELECT
Tasks.*,
CASE
WHEN TasksGroupedByUser.UserCount > 1 THEN 'Group'
ELSE 'Individual' + ' ' + Tasks.[User]
END
FROM Tasks
INNER JOIN TasksGroupedByUser ON
TasksGroupedByUser.Task = Tasks.Task
Полученная мудрость должна использовать парсеры-генераторы + грамматики, и она походит на хороший совет, потому что Вы используете строгий инструмент и по-видимому уменьшаете усилие и потенциал для ошибок при этом.
Для использования парсера-генератора грамматика должна быть свободным контекстом. При разработке languauge, который будет проанализирован затем, можно управлять этим. Если Вы не уверены затем, что это могло бы стоить Вам большого усилия при запуске вниз маршрута грамматики. Даже если это - контекст, свободный на практике, если грамматика не огромна, может быть более просто вручить коду рекурсивный достойный синтаксический анализатор.
Являющийся свободным контекстом не только делает парсер-генератор возможным, но он также делает кодированные синтаксические анализаторы руки намного более простыми. То, с чем Вы заканчиваете, является одним (или два) функции на фразу. Который является, если Вы организуете и называете код, чисто не намного более твердо видеть, чем грамматика (если Ваш IDE может показать вызов hierachies затем, можно в значительной степени видеть то, что грамматика).
advantages:-
, я не говорю, что грамматики являются всегда неподходящими, но часто преимущества минимальны и часто взвешиваются затратами и рисками.
(я верю, аргументы в пользу них обманчиво обращаются и что существует общая предвзятость для них, поскольку это - способ сигнализировать, что каждый - больше грамотной информатики.)
Немного советов:
Не злоупотребляйте регулярные выражения - в то время как у них есть свое место, они просто не имеют права обрабатывать любой вид реального парсинга. Можно продвинуть их, но Вы в конечном счете собираетесь врезаться в стену или закончиться с неудобной в сопровождении путаницей. Вы - более обеспеченное нахождение парсера-генератора, который может обработать больший набор языка. Если Вы действительно не хотите входить в инструменты, можно посмотреть на синтаксические анализаторы с рекурсивным спуском - это - действительно простой шаблон для почерка маленький синтаксический анализатор. Они не так гибки или мощны как большие парсеры-генераторы, но у них есть намного более короткая кривая обучения.
, Если у Вас нет очень трудных требований к производительности, попытайтесь разделить свои слои - чтения лексического анализатора в отдельных маркерах, синтаксический анализатор располагает тех, которые в дерево, и затем семантический анализ проверяет все и соединяет ссылки и затем заключительную фазу для вывода то независимо от того, что производится. Разделение различных частей логики сделает вещи легче поддержать позже.
Считайте большую часть книга Дракона сначала.
Синтаксические анализаторы не являются сложными, если Вы знаете, как создать их, но они не тип вещи, что, если Вы вставляете достаточно времени, Вы в конечном счете доберетесь там. Это - путь лучше для построения на основе имеющихся знаний. (Иначе ожидайте писать это и бросать его далеко несколько дюжин раз).
Да. Попытайтесь генерировать его, не пишут. Рассмотрите использование yacc, ANTLR, Flex/бизона, Coco/R, ЗОЛОТОГО Парсера-генератора, и т.д. Обратитесь к ручной записи синтаксического анализатора, только если ни один из существующих парсеров-генераторов не соответствует Вашим потребностям.
Во-первых, не пытайтесь применить те же методы к парсингу всего. Существуют многочисленные случаи возможного применения от чего-то как IP-адреса (немного специального кода) к программам C++ (которым нужен синтаксический анализатор промышленной силы с обратной связью от таблицы символов), и от ввода данных пользователем (который должен быть обработан очень быстро) к компиляторам (который, обычно может позволять себе провести немного времени, анализируя). Вы могли бы хотеть указать то, что Вы делаете, если Вы хотите полезные ответы.
111-секундный, имейте грамматику в виду для парсинга с. Чем более сложно это, тем более формальна спецификация должна быть. Попытайтесь допустить ошибку на стороне того, чтобы быть слишком формальным.
В-третьих, хорошо, который зависит от того, что Вы делаете.