2016-05-05 8 views
-1

マイ簡略SQLテーブルの行を削除:各グループについて3列有する前の状態SQL

Series_Group
Series_Index
Series_Value

を、Iは0を含むことができる一連の値の範囲を有します。だから私は最後の0の後の値がほしいです:
各グループについて、ゼロが発生したインデックスを見つけて、そのグループのすべての行を以前のインデックスで削除します。

+-------+-------+-------+ 
| Group | Index | Value | 
+-------+-------+-------+ 
|  1 |  1 |  1 | 
|  1 |  2 |  0 | 
|  1 |  3 |  1 | 
|  1 |  4 |  0 | 
|  1 |  5 |  6 | 
|  2 |  1 |  1 | 
|  2 |  2 |  0 | 
|  2 |  3 |  1 | 
|  2 |  4 |  5 | 
|  3 |  1 |  5 | 
+-------+-------+-------+ 

私はこれはunion allを使用してそれを行うための一つの方法です

+-------+-------+-------+ 
| Group | Index | Value | 
+-------+-------+-------+ 
|  1 |  5 |  6 | 
|  2 |  3 |  1 | 
|  2 |  4 |  5 | 
|  3 |  1 |  5 | 
+-------+-------+-------+ 
+1

あなたのRDBMSは何ですか? –

+0

グループ2の行が表示される理由は、「値= 0」がない場合です。 –

答えて

1

を維持する必要があります。

最初の部分は、1つのグループにつき1つの値= 0があるすべての後続の行を取得します。

2番目の部分は、グループごとに値に0がないすべてのグループを取得します。

Sample demo

select t.* 
from tablename t 
join (select grp,max(index) as mxindex from tablename where value = 0 group by grp) t1 
on t.grp = t1.grp and t.index > t1.mxindex 
union all 
select * from tablename 
where grp in (select grp from tablename group by grp having sum(case when value = 0 then 1 else 0 end) = 0) 
2

あなたはnot existsで試してみてくださいその

select * 
from table as a 
where index > coalesce((select max(index) 
    from table as b 
    where a.group=b.group and b.value=0),-1) 
0

ような何かを試すことができます。

select * from table t1 
where value <> 0 and not exists(select * from table t2 
           where t1.group = t2.group and 
             t2.index > t1.index and 
             t2.value = 0) 
+0

グループフィルタについてはわかりません... OPの出力は 'group = 2'の行を含み、0は含まない –

+0

このクエリは必要な行を返さなければなりません。彼は「グループごとに」調整した。 –

+0

申し訳ありませんが、正しい結果のようには見えません。 http://i.stack.imgur.com/qoxns.png –

0

SQL Serverを使用します。 row_numberを使用してrow_idを作成することができます。

フアン・カルロス・Oropezaのソリューションと同様に

SQL Demo

WITH cte 
    AS (SELECT [group], 
       [index], 
       [value], 
       ROW_NUMBER() 
        OVER (ORDER BY [group], [index]) AS rn 
     FROM table1), 
    last_zero 
    AS (SELECT Max(rn) rn 
     FROM cte 
     WHERE [value] = 0) 
SELECT c.[group], 
     C.[index], 
     C.[value] 
FROM cte C 
     CROSS JOIN last_zero L 
WHERE C.rn > L.rn 
+0

あなたのコードを試してみましたが、私が最初に提供したサンプルデータで動作しますが、それは各 "グループ"に対して実行されません。私は(私の質問で)データに小さな変更を加え、コードは正しい答えを返しません。 – user2864154

+0

はい、あなたは不明な点がありませんでした。私はあなたが0の後にすべての行を必要とするかどうかを理解していませんでしたが、グループ内に...または私の場合は残りの行。私はあなたに@vkpソリューションをお勧めします。 –

0

が、CT​​E

DECLARE @t TABLE ([Group] INT, [Index] INT, [Value] INT) 
INSERT INTO @t VALUES (1,1,1) 
INSERT INTO @t VALUES (1,2,0) 
INSERT INTO @t VALUES (1,3,1) 
INSERT INTO @t VALUES (1,4,0) 
INSERT INTO @t VALUES (1,5,6) 
INSERT INTO @t VALUES (2,1,1) 
INSERT INTO @t VALUES (2,2,5) 

SELECT * FROM 
(
    SELECT ROW_NUMBER() OVER (ORDER BY [Group], [Index]) AS RowNum, * 
    FROM @t 
) AS t1 
JOIN 
(
    SELECT MAX(t3.RowNum) AS MaxRow, t3.[Group] 
    FROM 
    ( 
    SELECT t2.RowNum, t2.[Group] FROM 
    ( 
     SELECT ROW_NUMBER() OVER (ORDER BY [Group], [Index]) AS RowNum, * 
     FROM @t 
    ) AS t2 
    WHERE t2.Value = 0 
) AS t3 
    GROUP BY t3.[Group] 
) AS t4 ON t1.[Group] = t4.[Group] AND t4.MaxRow < t1.RowNum 
0

のない別のオプション:

select t.* from Table1 t 
left outer join ( 
    select [Group], 
    max(case when [Value] = 0 then [Index] else 0 end) zero_index 
    from Table1 
    group by [Group] 
) a 
on t.[Group] = a.[Group] 
where t.[Index] > a.zero_index; 
関連する問題