группировка по в SQL, улучшение запроса

#sql #oracle #group-by

#sql #Oracle #группировка по

Вопрос:

Я столкнулся с одной небольшой проблемой. У меня есть таблица MY_CHART_TABLE(ID,REASON_CODE,QUANTITY)

 101 CompFail    57
101 FitFinish   18
101 CompDamage  16

102 NoFail      57
102 NoFinish    18

103 FullDamage  16
  

вывод, который я хочу

 101 CompFail    57   3
101 FitFinish   18   3
101 CompDamage  16   3

102 NoFail      57   2
102 NoFinish    18   2

103 FullDamage  16   1
  

Мне нужно сохранить количество в конце на основе идентификатора. как я могу это сделать?

Я использую запрос ниже

 SELECT 
   id, 
   reason_code, 
   quantity, 
   COUNT(*) OVER (PARTITION BY id )
FROM MY_CHART_TABLE; 
  

Есть ли лучший способ улучшить запрос? можно ли это сделать с помощью group by?

Комментарии:

1. Ваш запрос — правильный способ сделать это.

2. Ваш запрос в порядке.

3. Можно ли это сделать с помощью group by?

Ответ №1:

Ваш код хорош как есть, но если вам необходимо использовать group by , вы можете использовать производную таблицу для получения подсчетов, прежде чем join возвращать ее в основную таблицу.

 select a.*, b.counts 
from MY_CHART_TABLE a 
join (select id, count(*) as counts 
      from MY_CHART_TABLE 
      group by id) b on a.id=b.id; 
  

Что касается вашей проблемы, я бы повторил, что ваш код является более чистым и лучшим способом сделать это. Обратите внимание, что ваш код как есть будет считать все строки для каждого идентификатора. Если вам нужно только подсчитывать отдельные строки для каждого идентификатора, вы можете добавить a group by . Window functions применяются после group by , так что таким образом — вы будете считать только отдельные строки для каждого идентификатора

 select id, reason_code, quantity, count(*)  over (partition by id)
from MY_CHART_TABLE
group by id, reason_code, quantity; 
  

Ответ №2:

Вы можете использовать CTE с group by

 ;with cnts as(
    select 
        id,
        [count] = count(*)
    from MY_CHART_TABLE
    group by id
)
    select mct.*, cnts.[count]
    from MY_CHART_TABLE mct
    join cnts 
        on cnts.id = mct.id