Удалите дублирующую строку и обновите следующую строку до текущей строки и продолжите - PullRequest
1 голос
/ 26 января 2012

Мне нужен запрос на выбор. *

Среда: SQL DBA -SQL SERVER 2005 или новее

Пример:
В этом примере таблицы, если я выберу топ-20, нет повторяющихся записейдолжен прийти, и следующая запись должна быть в 20 записях.

Пример:

123456 не должен повторяться в 20 записях, и если 18-е дублировано, вместо 18-го должна появиться 19-я запись и в 19-м- 20-е должно наступить, 20-е - 21-е должно прийти.

Не беспокойтесь о Asc или Desc для строк.

Таблица поиска до

Id                                  Name 
123456                              hello
123456                              hello
123654                              hi
123655                              yes

Таблица поиска после

Id                                  Name
123456                              hello
123654                              hi
123655                              yes

Мой стол:

CREATE TABLE [dbo].[test](  
[Id] [int] IDENTITY(1,1) NOT NULL,
[ContestId] [int] NOT NULL,
[PrizeId] [int] NOT NULL,
[ContestParticipantId] [int] NOT NULL,
[SubsidiaryAnswer] [varchar](256) NOT NULL,
[SubsidiaryDifference] [bigint] NOT NULL,
[AttemptTime] [datetime] NOT NULL,
[ParticipantName] [varchar](250) NOT NULL,
[IsSubscribed] [bit] NOT NULL,
[IsNewlyRegistered] [bit] NOT NULL,
[IsWinner] [bit] NOT NULL,
[IsWinnerConfirmed] [bit] NOT NULL,
[IsWinnerExcluded] [bit] NOT NULL) ON [PRIMARY] 

Мой вопрос: из этого выбора нам действительно нужны первые 20, но уникальные.

SELECT TOP 20 * FROM test order by SubsidiaryDifference 

Когда мы выполняем вышеуказанный запрос, у нас в настоящее время есть несколько двойников.В случае, если есть двойной, нам нужно взять их только 1 раз и взять следующий

Кто-нибудь знает эту проблему?

Заранее спасибо:)

1 Ответ

1 голос
/ 26 января 2012

Читая ваш вопрос, кажется, что вы действительно не хотите удалять строки из таблицы - вы просто хотите отобразить ТОП 20 отдельных строк - вы пытаетесь что-то вроде этого:

;WITH LastPerContestParticipantId AS
(
   SELECT 
       ContestParticipantId,
       -- add whatever other columns you want to select here
       ROW_NUMBER() OVER(PARTITION BY ContestParticipantId
                         ORDER BY SubsidiaryDifference) AS 'RowNum'
   FROM dbo.Test
)
SELECT TOP (20) 
    ContestParticipantId, 
    -- add whatever other columns you want to select here
    SubsidiaryDifference
FROM 
    LastPerContestParticipantId
WHERE 
    RowNum = 1

Это покажет вам самую последнюю строку для каждого отдельного ContestParticipantId, упорядочите по SubsidiaryDifference - попробуйте!

Обновление № 2: Я создал быстрый пример - он использует данные из вашего исходного сообщения - плюс дополнительный столбец SubID, чтобы я мог упорядочить строки одного и того же ID по что-то ...

Когда я запускаю это с моим запросом CTE, я получаю только одну запись для каждого ID - так что именно "не работает" для вас?

DECLARE @test TABLE (ID INT, EntryName VARCHAR(50), SubID INT)

INSERT INTO @test 
VALUES(123456, 'hello', 1), (123456, 'hello', 2), (123654, 'hi', 1), (123655, 'yes', 3)

;WITH LastPerId AS
(
   SELECT 
       ID, EntryName,
       ROW_NUMBER() OVER(PARTITION BY ID ORDER BY SubID DESC) AS 'RowNum'
   FROM @test
)
SELECT TOP (3) 
    ID, EntryName
FROM 
    LastPerId
WHERE 
    RowNum = 1

Дает вывод:

ID      EntryName
123456   hello
123654   hi
123655   yes

дубликатов нет.

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