0

私は以下のようなテーブルを持っています

OP    OP_var    SPS    SPS_sq
1010    01    KEB_x    01
1010    01    KEK_x    02
1010    02    KEH_c    01
1010    02    KEK_y    02
1010    02    KEB_d    03
1020    01    KEK_f    01
1020    01    KEE_g    02

OP 列には分散 (OP_var) があり、その中に SPS のグループがあります。SPS_sq は、 内のこれらの SPS ラインのシーケンスですOP+OP_var

KEK% の SPS_sq が最後ではない場合に KEK% を表示したいと思います (つまり、KEK% は、最後でない限り、OP および OP_var のシーケンス番号の最初または途中のいずれかです。

出力は次のようになります。

OP     OP_var     SPS     SPS_sq
1010     02       KEK_y    02
1020     01       KEK_f    01     

KEK%内の最後の SPS_sq はすべて無視しOP+OP_varます。

4

2 に答える 2

0

(op, op_var)組み合わせごとにランダムな行を探していると思います。ランダム行は のような SPS を持つ必要があり'KEK%'、最後の行と同じ SPS を持つことはできません。(これは、それ自体が最後の行であってはならないことを意味します。)

この例では、SQL Server、Oracle、PostGRES で使用できるウィンドウ関数を使用しています。SQL Server 固有の方法 ( newid()) を使用して、ランダムな順序を作成します。

select  *
from    (
        select  row_number() over (
                    partition by yt1.OP, yt1.OP_var
                    order by newid()) as rn2 -- Random order
        ,       yt1.*
        from    dbo.YourTable yt1
        join    (
                select  row_number() over (
                            partition by OP, OP_var
                            order by SPS_sq desc) as rn
                ,       *
                from    YourTable
                ) as last_row
        on      yt1.OP = last_row.OP
                and yt1.OP_var = last_row.OP_var
                and last_row.rn = 1 -- Highest SPS_sq
        where   yt1.SPS <> last_row.SPS
                and yt1.SPS like 'KEK%'
        ) SubQueryALias
where   rn2 = 1 -- Random KEK row that doesn't share SPS with last row

SQL Fiddle の例。

于 2013-05-22T10:12:28.953 に答える
0

kek が (op, op_var) の最大 sps_sq にないすべての kek が必要な場合

select * from Table1 t
where t.sps like 'KEK%' 
and not exists
(select null from Table1 t1
inner join (select MAX(t2.sps_sq) as maxsps_sq, t2.op, t2.op_var 
            from Table1 t2
            GROUP BY t2.op, t2.op_var) as getmax
on t1.op = getmax.op and t1.op_var = getmax.op_var 
 and t1.sps_sq = getmax.maxsps_sq
where t1.op = t.op and t1.op_var = t.op_var and t1.sps = t.sps and t.sps_sq = t1.sps_sq
);

SqlFiddle

注意 : Andomar が気づいたように、これは最後の sps_sq 番号を持たない [op, op_var] のすべての kek% を使用します。

于 2013-05-22T10:00:52.420 に答える