2017-02-24 6 views
0

テーブルに複数の負の値と正の値がある場合、負の値を持ち、同じ正の値を持つレコードを削除したい。私は2つのレコードが正テーブル内の正と負の値を持つ同数のレコードを削除する

で負の値と4レコードとされた6つのレコードを持つテーブルを持って、私は簡単な例 - に

を与えるだろう...

このシナリオを説明するかどうかはわかりません

Name | number 
    A | 1 
    A |-1 
    A | 1 
    A |-1 
    A | 1 
    A | 1 

だからここに私は負の値と正の値 のレコードの同じ番号を削除したいので、私の出力を使用することにより

Name | Number 
A | 1 
A | 1 
+0

ロジックを実装できると仮定して、主キー列または行番号がない場合、どの行を保持するかを決定するにはどうすればよいですか? –

+0

質問をプライマリキーを含む実際のテーブル定義で更新してください。 –

+0

DISTINCTを試してみてください。> 0のフィルタネガティブ –

答えて

0

する必要があります

;WITH CTE AS (

select *,ROW_NUMBER()OVER(PARTITION BY number ORDER BY (SELECT NULL)) -1 RN from Table1) 

Select Name, number from CTE WHERE RN NOT IN (1,0) 
+0

これは動作するかどうかわかりませんが、間違いなくあなたの行機能は私に私の結果セットを手伝ってくれました。アイデアありがとう! – user3895001

+0

@ user3895001答えが – mohan111

+0

の場合、私はそれをやろうとしましたが、15ポイント以下のユーザーの評価は受け付けません。 – user3895001

-1

ROW_NUMBER

delete from table_name 
where substring(ltrim(rtrim(number)),1,1)='-' 
+0

1、-1はダミーの値です。 – user3895001

+0

あなたの質問があります。上記のクエリでは、 ' - '記号 – mangesh

+0

@mangeshdesaiで始まるレコードのみが削除されます。直接使用することができます。WHERE number <0 –

0
declare @negvalrecs int = (select COUNT(*) from tab where Number < 0) 

delete 
from tab 
where Number < 0 

delete top (@negvalrecs) 
from tab 
where Number > 0 
0

次のクエリでは、あなたのテーブルには主キーまたはあなたの記録を注文するためにいくつかの他の手段のいずれかであるidと呼ばれる列のいずれかを持っていることを前提とし、これを試してみてください。注文がなければ、あなたの質問に答えることはできません。実際には、私たちに示したデータサンプルは意味を持ちません。内部的なレコードにはSQLデータベースの順序がないからです。

WITH cte1 AS (
    SELECT t1.id, t1.number, SUM(t2.number) as sum 
    FROM yourTable t1 
    INNER JOIN yourTable t2 on t1.id >= t2.id 
    GROUP BY t1.id, t1.number 
) 
WITH cte2 AS (
    SELECT MAX(id) AS cutoff 
    FROM cte1 
    WHERE sum = 0 
) 
SELECT t.* 
FROM yourTable t 
WHERE t.id > (SELECT cutoff FROM cte2) 

使用しているSQL Serverのバージョンを教えてくれたことがないので、私は古い学校計算方法を使用していました。したがって、私はあなたが利用できるものについて仮定をしたくなかった。

0

あなたのすべての入力をありがとう!

私はそれのための解決策を持っています。私たちは行番号機能を必要としています。

--Providing row number to rows 
select *,row_number() over (partition by name,number order by name) R into #1 from Table 

--Taking negative values 
select * into #2 from #1 where number<0 

--Now Deleting those records from the main table by joining this table 
delete #1 from #1 a inner join #2 b on a.name=b.name and a.number=b.number and a.r<=b.r 

delete #1 from #1 a inner join #2 b on a.name=b.name and a.number=-(b.number) and a.r<=b.r 

希望します。

0

私は最近同様の問題に遭遇しました。これが私が解決した方法です。 私はまた、与えられた名前のためのネガもありません。

SELECT t1.name, t1.number 
FROM table t1 
LEFT OUTER JOIN 
(SELECT name, number FROM table where number < 0) t2 
ON 
t1.name = t2.name and t1.number = t2.number 
WHERE t1.number > 0 and t2.number IS NOT NULL 

UNION ALL 

SELECT t1.name, t1.number 
FROM table t1 
LEFT OUTER JOIN 
(SELECT name, number FROM table where number < 0) t2 
ON 
t1.name = t2.name 
WHERE t1.number > 0 and t2.number IS NULL;` 
関連する問題