#sql #sql-server #group-by
#sql #sql-сервер #группировка по
Вопрос:
Это мои структуры таблиц —
- Правило
- Набор Правил_rule_map
То, что я пытаюсь сделать, это объединить обе таблицы на основе правила.id и ruleset_rule_map.rule_id.
Хотите получить данные, подобные этому-
Если вы видите, я хочу удалить дубликаты из производного столбца — rule_bucket . В то же время я хочу отображать rule_order только для различий в производном столбце rule_bucket
Написал запрос для того же —
select DISTINCT rrm.RULE_ORDER, CONCAT(r.PARENT_RULE,
IIF(r.CHILD_RULE IS NOT NULL, CONCAT('|', r.CHILD_RULE), r.CHILD_RULE),
IIF(r.SUB_CHILD_RULE IS NOT NULL, CONCAT('|', r.SUB_CHILD_RULE), r.SUB_CHILD_RULE),
IIF(r.SUB_SUB_CHILD_RULE IS NOT NULL, CONCAT('|', r.SUB_SUB_CHILD_RULE), r.SUB_SUB_CHILD_RULE) )
AS RULE_BUCKET from [RULE] r
inner join RULESET_RULE_MAP rrm on rrm.RULE_ID = r.ID
and rrm.RULESET_ID = 'AAE97A62-F37E-4454-A008-FF40A102BB25'
and r.PARENT_RULE <> 'N/A' order by rrm.RULE_ORDER;
но с помощью приведенного выше запроса я могу получить только такой результат.
Может ли кто-нибудь, пожалуйста, помочь мне написать правильный запрос? Примеры, которые помогут мне решить вышеуказанное, также приветствуются.
Комментарии:
1. Изображения данных на самом деле не помогают нам помочь вам, особенно когда вы также не объясняете логику. Найдите время, чтобы опубликовать данные в формате, который можно использовать, и включите логику , лежащую в его основе. Отображение изображений имен ваших столбцов также не помогает нам узнать, как выглядят ваши данные.
2. В каком «потребляемом» формате вы ожидаете, что данные будут находиться? Пожалуйста, дайте мне знать. Я задал вопрос выше -> «Если вы видите, я хочу удалить дубликаты из производного столбца — rule_bucket . В то же время я хочу отображать rule_order только для различий в производном столбце rule_bucket «.
3. Что-то, что мы можем скопировать и вставить, что-то, что мы можем использовать . Мы не можем копировать данные из изображения, и это не помогает тем, у кого программы чтения с экрана. Однако лучше всего использовать инструкции DDL и DML, в противном случае вы можете использовать хорошо отформатированный tabular
text
.4. @Larnu — Спасибо! Обновит вопрос данными для таблицы ПРАВИЛ и таблицы RULESET_RULE_MAP.
5. @codingNubie . , , В ваших образцах данных все еще есть повторяющиеся правила, например, для строк 13 и 15, поэтому ваш вопрос все еще не ясен.
Ответ №1:
Если вы действительно используете одну строку для каждого блока правил, просто используйте агрегацию:
SELECT MIN(RULE_ORDER), RULE_BUCKET
FROM (SELECT rrm.RULE_ORDER,
CONCAT(r.PARENT_RULE,
IIF(r.CHILD_RULE IS NOT NULL, CONCAT('|', r.CHILD_RULE), r.CHILD_RULE),
IIF(r.SUB_CHILD_RULE IS NOT NULL, CONCAT('|', r.SUB_CHILD_RULE), r.SUB_CHILD_RULE),
IIF(r.SUB_SUB_CHILD_RULE IS NOT NULL, CONCAT('|', r.SUB_SUB_CHILD_RULE), r.SUB_SUB_CHILD_RULE)
) AS RULE_BUCKET
FROM [RULE] r JOIN
RULESET_RULE_MAP rrm
ON rrm.RULE_ID = r.ID AND
rrm.RULESET_ID = 'AAE97A62-F37E-4454-A008-FF40A102BB25' AND
r.PARENT_RULE <> 'N/A'
) r
GROUP BY RULE_BUCKET
ORDER BY MIN(rrm.RULE_ORDER);
Ответ №2:
Аналитическую функцию можно использовать следующим образом:
select * from
(select t.*, row_number() over (partition by RULE_BUCKET order by RULE_ORDER desc) as rn
from
(select rrm.RULE_ORDER,
CONCAT(r.PARENT_RULE,
IIF(r.CHILD_RULE IS NOT NULL,
CONCAT('|', r.CHILD_RULE), r.CHILD_RULE),
IIF(r.SUB_CHILD_RULE IS NOT NULL,
CONCAT('|', r.SUB_CHILD_RULE), r.SUB_CHILD_RULE),
IIF(r.SUB_SUB_CHILD_RULE IS NOT NULL,
CONCAT('|', r.SUB_SUB_CHILD_RULE), r.SUB_SUB_CHILD_RULE) )
AS RULE_BUCKET
from [RULE] r
inner join RULESET_RULE_MAP rrm on rrm.RULE_ID = r.ID
and rrm.RULESET_ID = 'AAE97A62-F37E-4454-A008-FF40A102BB25'
and r.PARENT_RULE <> 'N/A') t) t
where rn = 1
order by RULE_ORDER;