2009-09-18 5 views
6

私はこのようになりますTEMPTABLEあります複数の重複行が存在し、重複していない行を返す場合は、1行だけを返す方法?

RequestID | CreatedDate   | HistoryStatus   
CF-0000001 | 8/26/2009 1:07:01 PM | For Review 
CF-0000001 | 8/26/2009 1:07:01 PM | Completed 
CF-0000112 | 8/26/2009 1:07:01 PM | For Review 
CF-0000113 | 8/26/2009 1:07:01 PM | For Review 
CF-0000114 | 8/26/2009 1:07:01 PM | Completed 
CF-0000115 | 8/26/2009 1:07:01 PM | Completed 

をそして、どのように私が最後に見てテーブルが欲しいが、このようなものです:

RequestID | CreatedDate   | HistoryStatus   
CF-0000001 | 8/26/2009 1:07:01 PM | Completed 
CF-0000112 | 8/26/2009 1:07:01 PM | For Review 
CF-0000113 | 8/26/2009 1:07:01 PM | For Review 
CF-0000114 | 8/26/2009 1:07:01 PM | Completed 
CF-0000115 | 8/26/2009 1:07:01 PM | Completed 

すなわち、重複CF-0000001は削除する必要があります。

複数の重複行があり、重複していない行が返された場合は、1行だけを選択するといいですか?

+6

両方の表が同じです。予想される出力を修正してください。 – shahkalpesh

+0

**の重複を返します何**? MySQLのSQL? Oracle SQL? CouchDB?カサンドラ? MS SQL Server?ハスケルのリスト? ScalaのためのSQuery for-comprehension? Perlのテキストファイルですか?少年、私は行くことができます... –

+1

RequestIDとCreatedDateが同じ場合は、どの行が返されますか?それとも問題じゃない? – eksortso

答えて

0

これは、SQLの質問です、と私はあなたが求めているものを理解し、(それは完全には明らかではありません)、私はあなたを推測しているタイトルからクエリ

Select Distinct * From TempTable 
+1

Chebu HistoryStatusの値が異なるためです。 – eksortso

4
select t.* 
from (
    select RequestID, max(CreatedDate) as MaxCreatedDate 
    from table1 
    group by RequestID 
) tm 
inner join table1 t on tm.RequestID = t.RequestID and tm.MaxCreatedDate = t.CreatedDate 
+0

このクエリは、単に「複製」を返します。 'CreatedDate'の値は' RequestID = 'CF-0000001'のときと同じです。 – eksortso

+0

データには表示されませんが、実際には時間が異なると仮定していました。そうでなければ、ハードコードなしで複製があるときに返されるステータスを知る方法がありません。言葉の質問。 – RedFilter

5

に明確なを追加した場合ユニークな行ごとに1つの結果しか必要ないのですか?この場合はGROUP BY句(またはSELECT DISTINCT)をご覧ください。

3

クエリに1対多の関係がある場合は、一方の側で重複した行が発生することがあります。

は、以下の

TABLE TEAM 
ID  TEAM_NAME 
0  BULLS 
1  LAKERS 


TABLE PLAYER 
ID  TEAM_ID  PLAYER_NAME 
0  0   JORDAN 
1  0   PIPPEN 

を仮定し、あなたがあなたが重複したチーム名を持つことになります

TEAM_NAME PLAYER_NAME 
BULLS  JORDAN 
BULLS  PIPPEN 

を取得します

SELECT 
    TEAM.TEAM_NAME, 
    PLAYER.PLAYER_NAME 
FROM TEAM 
INNER JOIN PLAYER 

のようなクエリを実行します。あなたは、あなたのクエリで重複TEAM_NAMEをしたい以下の

SELECT ID, TEAM_NAME FROM TEAM 

を行うと、各チームのためにIDが

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = <PUT_TEAM_ID_RIGHT_HERE> 
を実行遭遇していない場合でも、DISTINCT句を使用して、結果セットは、重複したチーム名ので

が含まれています

だから、この方法あなたは片側重複参照を取得することはありません

に関して、

11

RequestIDとCreatedDateに基づいて重複した行の1つを表示し、最新のHistoryStatusを表示する場合は、これを試してください。

with t as (select row_number()over(partition by RequestID,CreatedDate order by RequestID) as rnum,* from tbltmp) 
Select RequestID,CreatedDate,HistoryStatus from t a where rnum in (SELECT Max(rnum) FROM t GROUP BY RequestID,CreatedDate having t.RequestID=a.RequestID) 

かだけを考慮しCreatedDateに重複行のいずれかを選択し、以下のクエリを試してみてください、最新のHistoryStatusを表示したい場合。

with t as (select row_number()over(partition by CreatedDate order by RequestID) as rnum,* from tbltmp) 
Select RequestID,CreatedDate,HistoryStatus from t where rnum = (SELECT Max(rnum) FROM t) 

それとものみリクエストIDを考慮し、重複行の1つを選択して、最新のHistoryStatusを表示したい場合は、その後

with t as (select row_number()over(partition by RequestID order by RequestID) as rnum,* from tbltmp) 
Select RequestID,CreatedDate,HistoryStatus from t a where rnum in (SELECT Max(rnum) FROM t GROUP BY RequestID,CreatedDate having t.RequestID=a.RequestID) 

下に私は、SQL Server 2005年に書かれたすべての上記のクエリをクエリを使用

+0

まあ、私はあなたのサンプルコードをコピーして貼り付けしようとしているときにあなたをうっかり落としました。 ...そして、システムは私に "upvote"に変わるようにそれを元に戻させません。それはあなたの幸運です:-) – Sukotto

-3

2行の重複列から1つの別個のレコードをフェッチするには、oracle自体が主キーとして管理する "rowid"列を使用できます。したがって、最初に

を試してみてください
"select rowid,RequestID,CreatedDate,HistoryStatus from temptable;" 

そして、SELECT文で使用して 'rowid'カラムの値だけ2番目のローをフェッチできます。

+0

これはオラクルを前提としていて、 "2番目の行をその値で取得します"誰かがそれが何であるか把握するために結果セットを見る必要がある場合、それは非常に興味深い「解決策」ではありません。あなたがあなたの質問を書く方法を知っているならば(あなたがROWIDを選択することなく)あなたの質問を編集してください。 – Mat

0
select * from temptable 
where rnum --unique key 
in 

( 
SELECT RNUM --unique key 
    FROM temptable 
WHERE ( HistoryStatus 
) IN (SELECT    HistoryStatus 

          FROM temptable 
          GROUP BY     
HistoryStatus 
          HAVING COUNT(*) <= 1)); 

このコードはテストされていません。私は同様のコードを使用し、それは動作します。 構文はOracleにあります。

-2

SELECT DISTINCT Xを使用してみてください。* から( クエリ

感謝。

+0

別名を使用すると、xテーブルからは異なる値のみが与えられますが、結合する他のテーブルからは区別されません –

関連する問題