Подсчет групп данных в SQL

У меня есть таблица примерно из 1,6 млн строк, где записи имеют уникальный (идентификационный) идентификатор, а затем также имеют 8-символьное поле «код». Поле кода, используемое для группировки данных в наборы... все строки с одинаковым кодом находятся в одном наборе. Каждый набор должен состоять из 12 записей, но, похоже, наша загрузка данных была отключена, а некоторые наборы неполные.

Мне нужно идентифицировать неполные наборы. Как мне написать запрос, чтобы выбрать только те записи, которые являются частью набора, который НЕ имеет надлежащего количества записей в своем наборе (12)?

Я использую MS SQL 2008.

Спасибо.


person Bryan Lewis    schedule 24.08.2010    source источник
comment
теперь вы можете выбрать правильный ответ примерно из 20 правильных ответов ;-). Удачи...   -  person Yves M.    schedule 24.08.2010


Ответы (7)


Попробуй это...

SELECT 
 CodeField, 
 COUNT(CodeField) 
FROM table 
GROUP BY CodeField 
HAVING COUNT(CodeField) < 12
person Yves M.    schedule 24.08.2010
comment
Я не ожидал, что так быстро будет много ответов. Спасибо всем! Работал хорошо. - person Bryan Lewis; 24.08.2010

Используйте это, чтобы получить коды с менее чем 12 записями в таблице:

  SELECT yt.code
    FROM YOUR_TABLE yt
GROUP BY yt.code
  HAVING COUNT(*) < 12

В этом упражнении вы должны использовать предложение HAVING — предложение WHERE не позволяет вам использовать агрегатные функции (MIN, MAX, COUNT...), если они не находятся в подзапросе, но предложение HAVING не имеет этого. ограничение.

Чтобы получить коды с количеством записей меньше или больше 12 в таблице, используйте:

  SELECT yt.code
    FROM YOUR_TABLE yt
GROUP BY yt.code
  HAVING COUNT(*) != 12

Придирка: != соответствует стандарту ANSI-92, а <>

person OMG Ponies    schedule 24.08.2010
comment
@LittleBobbyTables: Вы приближаетесь, почти слишком близко :p - person OMG Ponies; 24.08.2010
comment
вы получаете баллы за фактор !=. Потому что оказалось, что у нас тоже были наборы со слишком большим количеством предметов. :) - person Bryan Lewis; 24.08.2010

Это даст вам отдельные записи, которые необходимо обновить:

   SELECT *
    FROM MyTable
    WHERE CodeField IN
    (
        SELECT CodeField,
        COUNT(CodeField) AS [Count]
        FROM MyTable
        GROUP BY CodeField
        HAVING COUNT(CodeField) <> 12
    ) 
person flayto    schedule 24.08.2010
comment
Ошибка: слишком много полей в предложении IN. У вас один сравнивается с двумя - MySQL поддерживает кортежи, но я не пробовал его на SQL Server. Это также будет выполняться по одной и той же таблице дважды, когда это можно сделать за один проход - на самом деле подзапрос - это все, что вам нужно. - person OMG Ponies; 24.08.2010

Это идеальный случай для использования предложения having:

select codefield, count(*) from YOURTABLE
group by codefield
having count(*) <> 12

Предложение HAVING позволяет ограничить результаты запроса, содержащего GROUP BY, только те записи, которые соответствуют определенному условию. Вы можете думать об этом как о варианте предложения WHERE, который работает со сгруппированными наборами результатов.

Запрос может включать как предложение WHERE, так и предложение HAVING, однако имейте в виду, что предикат в предложении WHERE оценивается до группировки результатов, а предикат в предложении HAVING оценивается после.

person LBushkin    schedule 24.08.2010

Обратите внимание, что я использовал <>, а не <. Это позволит определить коды, в которых может быть слишком много элементов, а также коды, в которых их слишком мало.

select code, count(*) as count
from MyTable
group by code
having count(*) <> 12
person D'Arcy Rittich    schedule 24.08.2010

Это должно работать:

  select CodeField, count(*)
    from yourtable
    group by CodeField
    having count(*) <> 12
person Mladen Prajdic    schedule 24.08.2010

Вы можете сделать это с группой. Что-то вроде следующего:

select 
  groups.code,
  groups.code_count
 from
    (select 
      code,
      count(code) code_count
    from
     records_table
    group by code)  groups
where 
  groups.code_count != 12

Наслаждаться!

person Doug    schedule 24.08.2010