2017-12-28 9 views
0

私はいくつかの列を持っています。SQL - 別の列の値を一致させるために、ある列に最大値の行を取得する

ID - unique id for each row 
Key - Correlating to a specific action (there is occasional duplicates) 
Date - Lists the date and time for when each ID was created 

重複したキーがある場合は、大きなIDの行のみを検索する必要があります。消えいくつかの例については

Select t1.* 
From log as t1 
Where t1.ID = (Select Max(t2.ID) From log as t2 Where t2.Key = t1.Key) 
Order By ID 

これは、いくつかの非重複(すべてではない非重複)を含む、ただし行のLOTを取り除く

:私が持っているもの

key 107914 -> logs [4360, 4361] Stays with 4361 
key 107928 -> logs [4347, 4349, 4351, 4354, 4357] Gone 
key 119207 -> logs [1189, 724] Gone 
key 105079 -> logs [3399] Gone 
key 107309 -> logs [4364] Stays with 4364 
key 119210 -> logs [898] Gone 
+0

「gets rid of」と言うとき...重複している行を選択するのは意味しますか? (そして、SELECTを修正して重複しか持たないようにしたいのですが) – Grantly

+0

それはmysqlサーバーかsqlサーバーですか?それらは非常に異なるデータベースエンジンであり、この特定の質問のために、Sql Serverにはこれをはるかに簡単にするいくつかの機能があります。 –

+0

これはsqlサーバーです。キーの重複がなく、各キーのID値が最大の行だけが必要です。基本的には、同じ値の最新のキーだけでキー列をユニークにしたいと考えています。 –

答えて

0

これは動作しますが、SQL Serverの場合のみ有効です。 MySqlを使用している場合、その答えはより複雑です。

select r.* 
from (
    select distinct key from log 
) k 
cross apply (select top 1 * from log l where l.key = k.key order by id desc) r 
+0

を使用することをお勧めします。これは上記のクエリと同じ結果になりました。なぜ私はそれがキーのいくつかを目に見えるようにしていない理由についてはまだ分かりませんが。 –

+0

これは現在実際に動作しているようです。明らかに、問題の原因となっていたいくつかのLIKEフィルタに問題があったと思います。だから私の元のクエリも働いた。私はあなたに最高の答えとしてあなたをマークします。 –

0

あなたは簡単にこのクエリによって行うことができます

SELECT MAX(t1.Id), [key], <other columns> FROM log as t1 GROUP BY [key] 

これがあなたの基準を満たしているかどうかご連絡ください。

+0

これは私に最大IDを与えますが、最大IDが必要です一意のキーごとに –

+0

あなたはジョエルによって答えを得たのですか、それとももっと試そうとしますか? –

+0

私は今Joelの答えをテストしています –

関連する問題