Группировка значений, когда только все значения равны - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь сгруппировать некоторые данные. Это ситуация:

enter image description here

Я делаю этот выбор:

select
       min(id) id
      ,week
      ,percentage
from table1  
group by week,percentage

Может ли кто-нибудь мне помочь? Я хочу, чтобы он только группировался, если все значения равны. Если есть другое значение в процентах, оно не должно группироваться .. id3 не должно группироваться в течение недели 3. Я использую SQL Server 2012.

Спасибо.

1 Ответ

1 голос
/ 01 мая 2020

Вы действительно не хотите агрегации. Вы хотите удалить определенные идентификаторы.

Следующее объединяет все значения недели / процента вместе, чтобы получить один идентификатор для идентификации дубликатов. Несмотря на то, что я только что сказал, здесь используется агрегация для «фильтрации», чтобы получить первый:

select min(id) as id, week, percentage
from (select t1.*,
             string_agg(concat(week, ':', percentage), ',') within group (order by week) over (partition by id) as id_week_percentages
      from table1 t1
     ) t1
group by id_week_percentages, week, percentage;

Агрегация просто позволяет написать это без дополнительного подзапроса. Вы можете сделать что-то похожее на:

select top (1) with ties id, week, percentage
from (select t1.*,
             string_agg(concat(week, ':', percentage), ',') within group (order by week) over (partition by id) as id_week_percentages
      from table1 t1
     ) t1
order by row_number() over (partition by id_week_percentages, week, percentage order by id);

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

РЕДАКТИРОВАТЬ:

С for xml path:

select top (1) with ties id, week, percentage
from (select t1.*,
              (select concat(week, ':', percentage, ',')
               from table1 tt1
               where tt1.id = t1.id
               order by week, percentage
               for xml path ('')
              ) as id_week_percentages
      from table1 t1
     ) t1
order by row_number() over (partition by id_week_percentages, week, percentage order by id);
...