2013-05-22 21 views
0

測序選擇性輸出我有一個表像下面SQL - 顯示未最後在多發生

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是OP+OP_var內這些SPS行的排序。

我想顯示KEK%的SPS_sq不是最後一個(也就是說,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內最後

+0

爲什麼沒有輸出'1010 01'? – Andomar

+0

Hi Andomar,因爲1010 01中的KEK是最後一個KEK(通過引用SPS_sq列,這是OP + OP_var中SPS的序列列)。我只需要不是最後一個的KEK。謝謝你。 – user2408833

+0

啊,好的。你使用的是什麼數據庫(SQL Server,MySQL,Oracle,...)當你編輯你的問題時,一定要使用[markdown](http://stackoverflow.com/editing-help),而不是HTML。 – Andomar

回答

0

如果希望所有KEK其中KEK是不是在爲最大sps_sq( op,op_var)

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的預告,這將採取一切KEK%爲[OP,op_var]不具有最後sps_sq數。

+0

可以按照'(op,op_var)'返回多行,參見[sql小提琴](http://sqlfiddle.com/#!2/05387/1/0) – Andomar

+0

@Andomar,但它可能想... –

+0

@RaphaëlAlthaus - 我已經嘗試過您的查詢,一些條目缺失..我仍然試圖找出我的一些額外過濾是否丟失或是系統...將更新.. – user2408833

0

我假設你正在尋找一個隨機的行/ (op, op_var)組合。隨機行必須具有像'KEK%'這樣的SPS,並且它不能具有與最後一行相同的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 

Example at SQL Fiddle.

+0

Andomar,在OP + OP_var中可能會重複SPS。對不起,我應該早些提到這一點。 SPS是一個過程。它可以在一個組內重複。 – user2408833