Помогите с агрегированным запросом SQL с обнаружением дубликатов - PullRequest
2 голосов
/ 22 декабря 2010

У меня есть таблица, в которой есть записи, которые содержат информацию о людях и имя файла, из которого эта информация была получена, поэтому таблица выглядит так:

|Table|
|id, first-name, last-name, ssn, filename|

У меня также есть хранимая процедура, которая обеспечивает некоторую аналитикудля файлов в системе, и я пытаюсь добавить информацию к этой хранимой процедуре, чтобы пролить свет на возможность дублирования.

Вот текущая хранимая процедура

SELECT [filename],
       COUNT([filename]) as totalRecords,
       COUNT(closedleads.id) as closedRecords,
       ROUND(--calcs percent of records closed in a file)
FROM table
LEFT OUTER JOIN closedleads ON closedleads.leadid = table.id
GROUP BY [filename]

Что яхочу добавить - это возможность увидеть, возможно, # возможных дубликатов, определенных как записи с совпадающими номерами SSN, и я затрудняюсь с тем, как я могу выполнить подсчет для подзапроса или объединения и включить его в набор результатов.Кто-нибудь может предоставить несколько указателей?

Я пытаюсь добавить что-то подобное в мою процедуру выше

SELECT COUNT(
    SELECT COUNT(*) FROM Table T1
    INNER JOIN Table T2 on T1.SSN = T2.SSN
    WHERE T1.id != T2.id
) as PossibleDuplicates

Я ищу объединение этого кода с моей процедурой.выше, так что я могу получить все те же данные в одном и, возможно, иметь это количество дубликатов по каждому имени файла, поэтому для каждого имени файла я получаю результат # записей, количество закрытых записей и # возможных дубликатов

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

Я очень близок к желаемой цели, но мне не удается в последний раз - получить количество возможных дубликатов по имени файла, вот мой запрос

select [q1].[filename], [q1].leads, [q1].closed, [q2].dups
FROM (
    SELECT [filename], count([filename]) as leads,
    count(closedleads.id) as closed
    FROM Table
    left join closedleads on closedleads.leadid = Table.id
    group by [filename]
) as [q1]
INNER JOIN (
    select count([ssn]) as dups, [filename] from Table
    group by [ssn], [filename]
    having count([ssn]) > 1
) as [q2] on [q1].[filename] = [q2].[filename]

Это работает, но показывает несколько результатов для каждого имени файла со значениями 2-5 вместо суммирования общего количества возможных дубликатов

Рабочий запрос

Всем привет, спасибо за помощь,в конце концов это то, что я получил, чтобы это работало именно так, как я хотел

select [q1].[filename], [q1].leads, [q1].closed, [q2].dups,
        round(([q1].closed / [q1].leads), 3) as percentClosed
FROM (
    SELECT [filename], count([filename]) as leads,
    count(closedleads.id) as closed
    FROM Table
    left join closedleads on closedleads.leadid = Table.id
    and [filename] is not null
    group by [filename]
) as [q1]
INNER JOIN (
    select [filename], count(*) - count(distinct [ssn]) as dups 
            from Table
            group by [filename]
) as [q2] on [q1].[filename] = [q2].[filename]

Ответы [ 4 ]

3 голосов
/ 22 декабря 2010

Возможно, вы захотите где-нибудь использовать предложение HAVING, например:

    LEFT JOIN (
        SELECT SSN, COUNT(SSN) - 1 DupeCount FROM Table T1
        GROUP BY SSN
        HAVING COUNT(SSN) > 1 ) AS PossibleDuplicates
    ON table.ssn = PossibleDuplicates.SSN

Если вы хотите включить 0 возможных дубликатов (а не нуль), вам на самом деле не нужен HAVING клаузула, только левое соединение.

1 голос
/ 22 декабря 2010

Редактировать - Обновлено с лучшим примером, который лучше соответствует вашему вопросу

Вот пример, если я правильно понимаю.

create table #table  (id int,ssn varchar(10))

insert into #table values(1,'10')
insert into #table values(2,'10')

insert into #table values(3,'11')
insert into #table values(4,'12')


insert into #table values(5,'11')

insert into #table values(6,'13')


select sum(cnt)
from (
select count(distinct ssn) as cnt
from #table
group by ssn 
having count(*)>1
) dups

Вам не нужно самостоятельно присоединяться к столу, если вы группируете по ssn, а затем извлекаете только ssn там, где у вас их больше одного.

0 голосов
/ 22 декабря 2010

Я думаю, что существующие ответы не совсем понимают ваш вопрос.Я думаю, что я делаю, но это еще не полностью определено.Это дубликат, если один и тот же SSN отображается в двух разных файлах или только в одном и том же файле?Поскольку вы группируете по имени файла, это становится зерном.

Вывод вашего запроса будет выглядеть как

StateFarm1, 500,   50,    10%,   <your new value goes here>
AllState2,  100,   90,    90%    <your new value goes here>

Так что, если у вас есть одинаковый SSN в этих двух файлах, у вас есть 1 дубликата, поэтому в какой строке вы показываете 1, в строке AllState или в строке Statefarm?Если вы скажете и то и другое, неизменно кто-то будет СУММАТЬ этот столбец и получит удвоение результатов.

Теперь Что, если у вас есть строка Geico с тем же SSN, это 1 дубликат или 2?и снова, какой ряд?

Я знаю, что это не окончательный ответ, но эти вопросы действительно подчеркивают, что вопрос в том виде, в каком он стоит, не подлежит обсуждению ... вы исправите это, и я изменю ответ,

пожалуйста, не подавляйте в это время

Приложение

Я считаю, что единственное, чего вам не хватает, - это ОТЛИЧИЕ.

select [q1].[filename], [q1].leads, [q1].closed, [q2].dups
FROM (
    SELECT [filename], count([filename]) as leads,
    count(closedleads.id) as closed
    FROM tbldata
    left join closedleads on closedleads.leadid = Table.id
    group by [filename]
) as [q1]
INNER JOIN (
    select count( DISTINCT [ssn]) as dups, [filename] from Table '<---- here'
    group by [ssn], [filename]
    having count([ssn]) > 1
) as [q2] on [q1].[filename] = [q2].[filename]
0 голосов
/ 22 декабря 2010

Вам не нужен внешний COUNT - ваш внутренний SELECT COUNT(*)... вернет вам только одно число, количество записей с дубликатом SSN, но с другим id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...