0

いくつかのリンクされたテーブルがあり、サブテーブルの 1 つに指定された値を持つ行に 3 つの (またはユーザー設定のパラメーター) レコードがあり、順序付けが日付順であるデータのセットを見つけようとしています (別のリンクテーブル)

Table1
ID     LinkID   Flag
AA1    AA       30
AA2    AA       30
AA3    AA       60
AA4    AA       30
BB1    BB       30
BB2    BB       30
BB3    BB       30
BB4    BB       40

Table2
TA1    CA      2/1/2013
TA2    CA      1/1/2013
TA3    CA      12/1/2012
TA4    CA      11/1/2012
TB1    CB      2/2/2013
TB2    CB      1/1/2013
TB3    CB      12/1/2012
TB4    CB      11/2/2012

他のテーブルはそれらをリンクしますが、リンクされた CA レコードへの AA を取得できます。

AA       30     2/1/2013
AA       30     1/1/2013
AA       60     12/1/2012
AA       30     11/1/2012
BB       30     1/1/2013
BB       30     2/2/2013
BB       30     12/1/2012
BB       40     11/2/2012

最後の 3 つの連続した '30' レコードを含むレコードが必要な場合は BB のみを取得し、最後の 2 つの連続した '30' レコードを含むセットが必要な場合は両方を取得するようにクエリするにはどうすればよいですか? そしてもちろん、最新のレコードに 30 のフラグがないデータについては、そのデータを取得することはありませんか?

ダースほどのテーブルを結合し、最新の 30 に基づいてデータを返し、前のデータを表示する既存のクエリから始めています。この変更のために、私はそれを完全に再編成する必要があると思いますが、私はそれにアプローチする方法についても空白を描いています.上記は私がやろうとしていることを示していると思います.

作業用のSQLは必要ありません(とにかく十分なデータ例を提供していませんでした)が、別の間接的にリンクされたテーブルで見つかった順序に基づいて、指定された値を持つ連続したレコードを見つける方法を示すSQL疑似コードです。さらに言えば、上記の結果セットのように、すべてが 1 つのテーブルにある場合の取得方法です。

4

2 に答える 2

3

LAGand/orLEAD分析関数を使用する必要があるようです。たとえば、

LAG( flag ) OVER (PARTITION BY id ORDER BY date_column DESC) prior_flag_value

に基づいて、flagその値の列の以前の値を返します。複数の行をさかのぼることもできますiddate_column

LAG( flag, 2 ) OVER (PARTITION BY id ORDER BY date_column DESC) prior_flag_value

2行前の値を取得します。同様にLEAD、次の行の値を取得するために使用できます。

于 2013-03-06T22:44:27.183 に答える
0

日付に基づいて、連続して表示されるレコードの数を探しているようです。

これを行うには、次の手順を実行します。

(1) 各 col1 値に対して row_number() を使用して月を列挙します: row_number() over (partition by col1)as seqnum_1.

(2) col1、col2 の組み合わせごとに、row_number() を使用して月を列挙します: row_number() over (partition by col1, col2)as seqnum_2。

(3)seqnum_1 - seqnum_2連続した値のグループを識別するようになりました。

(4) 各レコードの各グループについて、これをカウントします count(*) over (partition by col1, seqnum_1 - seqnum_2) as thegroupsize

これで、groupsize に 2 つ以上の要素がある場所を選択できるようになりました。

于 2013-03-06T22:57:44.313 に答える