2012-01-26 4 views
1

を続ける私は選択クエリを必要とする。..は、現在の行に重複した行と更新次の行を削除し、

環境:SQL DBA -SQL Server 2005またはそれ以降

例:このサンプルテーブルで
、もし私はトップ20を選択します。重複レコードは来なくて、次のレコードは20レコードになります。

例: は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

**ユニーク**何の基準で?どの列が一意でなければならないのですか? –

+0

@marc_s contestparticipantidは一意でなければならず、結果は副相違によって注文する必要があります – Rizvan

+0

私の応答が更新されました。 –

答えて

1

は、あなたが本当にテーブルから行を削除する必要はありません表示されます - あなただけのTOP 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 

これはSubsidiaryDifferenceで注文、各個別ContestParticipantIdのためにあなたに最新行が表示されます - それを試してみてください!

更新#2:私は迅速なサンプルを作成しました - 私は何かで同じIDの行を注文することができるように

...プラス追加 SubID列 - それはあなたのオリジナルのポストからのデータを使用しています

CTEクエリでこれを実行すると、それぞれIDのエントリが1つしかありません。つまり、「動作していない」ものは何ですか?

ID  EntryName 
123456 hello 
123654 hi 
123655 yes 

重複なし:

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 

は、出力を与えます。

+0

@Tintin:**はしないでください**テーブルの定義とサンプルデータをコメントに投稿しないでください - **本当に難しい**です....代わりに:**アップデート**あなたの質問を編集して追加情報を提供してください! –

+0

ok私は今、そのことをしています – Rizvan

+1

@Tintin:CTEアプローチを使用しているときに*重複*を取得しますか?その場合、あなたは私たちに真実を伝えるわけではありません。CTEは 'ID'に基づいてすべての重複を除外します - 単に' ID'列以上をチェックする必要がありますか? –

関連する問題