2017-07-28 14 views
0

私は現在、 7.5mioの行と16の列。行の1つは私の大学で使用する内部識別子(IDと呼ぶ)です。別の列には文字列が含まれています。Sqlが最長の文字列で行を検索し、残りの文字列を削除します

IDは行の一意索引ではないため、表内で1つの識別子が複数回表示される可能性があります.2つの行の唯一の違いは文字列です。

すべての行をIDで検索し、最も長い文字列を保持し、元のテーブルから他のすべての行を削除する必要があります。残念なことに、私はSQL初心者の方です。この時点で私は本当に立ち往生しています。だから誰かが助けることができれば、これは本当にいいだろう。

答えて

0

このサンプルを見てみましょう:

SELECT * INTO #sample FROM (VALUES 
    (1, 'A'), 
    (1,'Long A'), 
    (2,'B'), 
    (2,'Long B'), 
    (2,'BB') 
) T(ID,Txt) 

DELETE S FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY LEN(Txt) DESC) RN 
    FROM #sample) S 
WHERE RN!=1 

SELECT * FROM #sample 

結果:

ID Txt 
-- ------ 
1 Long A 
2 Long B 
+0

ありがとうPawel!ちょうど試しましたが、それは魅力のように機能しました! – Abbraxas

0

をそれはちょうどSQLで可能かもしれないが、私はそれを行う方法を知っている方法は、2つになりますアプリケーションコードを使用した-passアプローチ - あなたが書いているアプリケーションがあると仮定します。

最初のパスは次のようなものになるだろう:あなたが使用しているどんな言語で結果をループしたいその後

SELECT theid, count(*) AS num, MAX(LEN(thestring)) AS keepme FROM thetable WHERE num > 1 GROUP BY theid

あなたと返された文字列にマッチするものを除いて、そのIDを使って何を削除します。私が知っている言語はPHPですので、私の例で使用しますが、その方法はどの言語でも同じです(簡潔にするため、エラー検査、準備された文などをスキップしています。慎重に):

$sql = 'SELECT theid, count(*) AS num, MAX(LEN(thestring)) AS keepme FROM thetable WHERE num > 1 GROUP BY theid'; 
$result = sqlsrv_query($resource, $sql); 
while ($row = sqlsrv_fetch_object($result)) { 
    $sql = 'DELETE FROM thetable WHERE theid = '.$row->theid.' AND NOT thestring = '.$row->keepme; 
    $result = sqlsrv_query($resource, $sql); 
} 

あなたは、2つの文字列が同じ長さであれば、あなたがしたいと思うものを言いませんでしたので、このソリューションは、すべてのことを扱っていない - 私は、各IDのみを持っていることを仮定しています1つの最も長い文字列。

+0

はい、それはユニプロジェクトです。私は数学者であり、これはデータを取得するための最初のステップにすぎません。私は現時点で開発しているRとlib ++を使って作業しています。 Rを使用すると、少なくとも私の実装では28日間のCPU時間がかかりました。だから、dbmsがインストールされているサーバでもっと速く動作するSQLクエリを試すことが重要でした。興味があれば私の実装をRで概説することができますが、まだそれに慣れているのでかなり簡単です。私はC + + /ブーストの男の多くです – Abbraxas

関連する問題