2016-09-10 10 views
1

[免責事項:私は問題を表現するのに苦労します。すべて歓迎]他の行に依存するSQLクエリを実行するにはどうすればよいですか?

私のSQLの理解では、関係は主に行の取得に焦点を当てています。

val2=Zの行の後にval2=Vの行がある場合は、効率的にどのようにして効率的に処理できますか? 。言い換えれば、どのように私は私が興味を持って行のシーケンスがあるかどうかを確認するには、行を次のように頭を見ることができるクエリを表現するん

id  val1 val2 
0  A  Z 
1  B  V 
2  C  Z 
3  D  B 

に基づいて

を更新## (役に立つかもしれない)答え、私は1つの余分なことについてはっきりする必要があります:私が見ることができるシーケンスは柔軟で(それはまたZ Bかもしれない)、またその長さは変わることができます。

+0

この場合、条件付きインデックスが動作するとわかります: 'select * from tblname as a val2 = 'z'そして(bblとしてbblからt2を選んでb.id> a.id order by b.id limit 1)= 'v'' - これは最初に 'val2 =' z''のインデックスをチェックし、サブクエリに基づいてそれを条件付きで絞り込む必要があります。私はPHPでこの種のロジックを個人的にやっていますが... –

+3

注:SQLでは、行には固有の順序はありません。したがって、次の行が何であるかを決定するために使用する順序を定義しない限り、「次の行」はありません。 – RBarryYoung

+1

@RBarryYoung。 。 。 'id'カラムがこの質問に対してこの情報を提供すると仮定することは合理的です。 –

答えて

2

ANSI標準は、lead()lag()の関数を持っています。あなたは結果セットの両方の行をしたい場合は、操作を行います。

select t.* 
from (select t.*, 
      lag(val2) over (order by id) as prev_val2, 
      lead(val2) over (order by id) as next_val2 
     from t 
    ) t 
where (val2 = 'Z' and next_val2 = 'V') or 
     (prev_val2 = 'Z' and next_val2 = 'Z'); 

注:私は解釈していますidに基づいて、次の行にあるものとして、「行が続いています」。 ZVV、ZZVなどのデータを扱う場合、他の解釈はあいまいになります。

+0

これはクールです(そして私にとっては初めてです)!あなたの答えには1ビットもあります。「あなたの結果セットに両方の行が必要な場合は、私も考えています。確かに、私はこのパターンと一致するすべての行を取得することに気付きます。しかし、彼らは彼らが一致する方法で行をグループ化しません...おそらくこれを行うことは、行のシーケンスを取得することは最善のことではありません。このタイプの検索に適した別のスキーマがありますか? – Private

+0

@Private。 。 。言い換えれば、私はあなたのスキーマとは異なるスキーマを示唆するほどの特有の問題は見つけられません。おそらく、サンプルデータを使って別の質問をしたり、質問の例や戻ってきたい結果セットを尋ねたりすることができます。 –

+0

ありがとうございます。行数が2より大きい場合にもソリューションが拡張されますか(例: 'ZVZ')? – Private

-2

私はあなたがSQLでしかできないと思います。

私の解決方法は、データベースから値を取得するためにSQLデータベース(PHP、C、...)に接続できる言語を使用し、その言語でテストします。

関連する問題