Отображать другие значения столбца только для разных значений в производном столбце

#sql #sql-server #group-by

#sql #sql-сервер #группировка по

Вопрос:

Это мои структуры таблиц —

  1. Правило

введите описание изображения здесь

  1. Набор Правил_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;