我需要一个选择查询..
环境: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
当我们进行上述查询时,我们目前有一些双重。如果有双,我们只需要他们一次,然后采取下一个
有谁知道这个问题?
提前致谢:)
答案 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
没有重复。