Подсчет различий на основе одного столбца

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть следующая таблица

 ID | AreaPath | IterationPath |

1       Area1     Iteration1
2       Area2     Iteration1
2       Area2     Iteration2
  

Я хочу использовать count только для столбца ID.

Требуемый результат должен быть:

 CountID | ID | AreaPath | IterationPath |

    1      1    Area1      Iteration1
    2      2    Area2      Iteration1
    2      2    Area2      Iteration2
  

Следующий запрос :

 select 
    count(TRV.ID ) as CountID, 
    TRV.ID,
    TRV.AreaPath, 
    TRV.IterationPath 
FROM table TRV 
Group BY AreaPath, IterationPath 
  

Выдает мне следующий вывод:

 CountID | ID | AreaPath | IterationPath |

    1      1    Area1      Iteration1
    1      2    Area2      Iteration1
    1      2    Area2      Iteration2
  

Как я должен изменить его, чтобы получить желаемый результат?

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

1. Какую СУБД вы используете? Кстати, это то, что я называю правильным способом задавать вопросы. Все делают так, как делает @OrenAshkenazy!

2. Поскольку вы группируете по обоим AreaPath и IterationPath , будут учитываться только уникальные комбинации, поэтому результат вашего запроса правильный. Почему вы ожидаете, что CountID будет выводиться как 2? Вам нужно будет группировать только по AreaPath.

3. @Quassnoi: За исключением того, что их запрос не мог быть скомпилирован на SQL Server…

Ответ №1:

Во всех базах данных большой четверки, кроме MySQL:

 SELECT  COUNT(*) OVER (PARTITION BY id) cnt,
        m.*
FROM    mytable m
  

В MySQL:

 SELECT  (
        SELECT  COUNT(*)
        FROM    mytable mi
        WHERE   mi.id = m.id
        ) cnt,
        m.*
FROM    mytable m
  

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

1. Какие базы данных «большой четверки»? Я могу вспомнить только Oracle, MSSQL и DB2 (если я не ошибаюсь :] ).

2. @LuiggiMendoza: MySQL, SQL Server, Oracle, PostgreSQL.

3. Однако они хотят, COUNT(DISTINCT) а SQL Server этого не делает COUNT(DISTINCT) OVER ... .