2012-05-02 4 views
-2

私はこのような二つの列いますので、見つかった場合、それは、その後、同じユーザーIDをスキップした場合、今私は、前の行のエントリのいずれかが最後の行の最後の値を持っているかどうかを確認するために値が同じ列で繰り返されるかどうか比較するには?

ChannelURI UserId 
1020   1 
1040   2 
1060   3 
1020   5 
1090   4 
1020   5 

をしたいです(マッチ)と異なるユーザIDを使用して、この場合にはChannelUri

にnullを挿入user ID =1null

にそれを達成するためにどのように任意のアイデアをそのchanneluriセットを持っている必要がありますか?

+6

「前回」と「最後」とはどういう意味ですか?これらの言葉はあなたが注文していることを前提としています。あなたはどの列を注文していますか? –

+0

「ChannelUriにnullを挿入する」と言ったとき、クエリによって返された値を意味するのか、答えの1つが合理的に仮定されているので文字通りテーブルのデータを変更するのでしょうか? – hatchet

答えて

2

SQLは、データを順序付けられていないセットと見なします。 ORDER BYを指定しない限り、行は正当な順序で返されます。

データを注文することができる別のフィールドがない限り、「前のレコード」は実際には何でもあり得ます。


あなたちょうど、すべてのデータを選択して、PHPまたは.NETでそれを解析することができますか? Nope。

データが通常が同じ順序で戻ってくるからといって、それが保証さ決してです。データの変更、ディスク上のデータの断片化、索引、並行性などの多くの要因によって、データはいつでも異なる順序で返されます。


あなたのロジックがデータの順序に依存している場合

、あなた 必見は、ORDER BY句を指定して、そう、暗に、それを注文することができますデータのフィールドを持っている必要があります。

申し訳ありません。

2

あなたはあなたがすることによってあなたの行を注文するために使用される列'Sort'を持っていることを、次の文は、トリックを行うだろうと仮定:

UPDATE m 
SET ChannelURI = NULL 
FROM mytable m 
JOIN mytable m2 
    ON m.ChannelURI = m2.ChannelURI 
    AND m.UserId != m2.UserId 
    AND m2.Sort = (SELECT MAX(sort) FROM mytable) 
+1

@Demsどうですか? http://sqlfiddle.com/#!3/7be73/8 – erikxiv

+0

+1:しかし、あなたの前提が真実なら、私は* AND m2.sort =(SELECT MAX(sort)from mytable) 'または等価な... '前の行のエントリのどれかが最後の行の最後の値を持つかどうかをチェックする' * [重要な部分は最後の行です。] *私は100%確実ではありません。 – MatBailie

+0

@Dems真実、私は答えを更新しました。私のバージョンでは、ChannelURIがユーザーごとに一意であることを確認し、OPが尋ねたときに最後の行を気にする必要はありません。 – erikxiv

0

基本的に、これは@erikxiv's answerと同じ考え方を採用し、これにSELECT TOP (1)を使用していますMAX(sort)の代わりに最後の行を取得:

UPDATE m 
SET ChannelURI = NULL 
FROM mytable m 
JOIN (
    SELECT TOP (1) ChannelURI, UserId 
    FROM mytable 
    ORDER BY sort DESC 
) last 
    ON m.ChannelURI = last.ChannelURI 
    AND m.UserId != last.UserId 
関連する問題