删除重复行并将下一行更新为当前行并继续

时间:2012-01-26 06:08:44

标签: sql-server-2005 select

我需要一个选择查询..

环境: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

之后的LookUp表
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 个答案:

答案 0 :(得分:1)

阅读你的问题,看起来你真的不想删除表中的行 - 你只想显示前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列,以便我可以订购相同的行{ {1}}某事......

当我使用我的CTE查询运行时,我只为每个ID获得一个条目 - 那么究竟什么是“不工作”?

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

没有重复。