Поиск повторяющихся строк, но пропустить последний результат? - PullRequest
1 голос
/ 12 августа 2010

Я пытаюсь найти дубликаты строк в моей БД, например:

SELECT email, COUNT(emailid) AS NumOccurrences 
FROM   users 
GROUP BY emailid HAVING ( COUNT(emailid) > 1 )

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

В другой таблице есть столбец с именем дубликаты , который должен содержать количество дубликатов из выбора.Допустим, у нас есть 3 строки с одинаковым emailid .Столбец duplicates содержит «3» во всех 3 строках.То, что я хочу, это "2" в первых 2 и ничего или 0 в последней из 3 совпадающих строк идентификатора.

Возможно ли это?

Обновление:

Теперь мне удалось создать временную таблицу, которая выглядит примерно так:

mailid | rowcount | AmountOfDups
643921 | 1 | 3
643921 | 2 | 3
643921 | 3 | 3

Теперь, как я могу решить, что только первые 2 должны быть обновлены (по mailid) в другой?Таблица?На другой таблице также есть mailid.

Ответы [ 2 ]

0 голосов
/ 12 августа 2010

Используя Sql Server 2005+, вы можете попробовать что-то вроде (полный пример)

DECLARE @Table TABLE(
        ID INT IDENTITY(1,1),
        Email VARCHAR(20)
)

INSERT INTO @Table (Email) SELECT 'a'
INSERT INTO @Table (Email) SELECT 'b'
INSERT INTO @Table (Email) SELECT 'c'
INSERT INTO @Table (Email) SELECT 'a'
INSERT INTO @Table (Email) SELECT 'b'
INSERT INTO @Table (Email) SELECT 'a'

; WITH Duplicates AS (
        SELECT  Email,
                COUNT(ID) TotalDuplicates
        FROM    @Table
        GROUP BY    Email
        HAVING  COUNT(ID) > 1
)
, Counts AS (
        SELECT  t.ID,
                ROW_NUMBER() OVER(PARTITION BY t.Email ORDER BY t.ID) EmailID,
                d.TotalDuplicates
        FROM    @Table t INNER JOIN
                Duplicates d    ON  t.Email = d.Email
)
SELECT  ID,
        CASE
            WHEN EmailID = TotalDuplicates
                THEN 0
            ELSE TotalDuplicates - 1
        END Dups
FROM    Counts
0 голосов
/ 12 августа 2010
SELECT ...
       ROW_NUMBER() OVER (PARTITION BY email ORDER BY emailid DESC) AS RN
FROM ...

... является отличной отправной точкой для такой проблемы. Никогда не стоит недооценивать силу ROW_NUMBER ()!

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