#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