0

私はこの問題に頭を悩ませていて、スタック交換でいくつかの同様の状況を見てきましたが、読めば読むほど混乱します! 次のテーブルがあります。

id | zipcode | provider | channel
---------------------------------
1  | 91773   | 342      | 0
2  | 91773   | 2261     | 177
3  | 91773   | 5590     | 0
4  | 91773   | 5590     | 0
5  | 91773   | 5590     | 135
6  | 91773   | 5590     | 0
7  | 91773   | 6010     | 0
8  | 91773   | 6010     | 0

レコードを 1 つだけ保持したいのですが、チャネルに 0 以外のものがある場合は保持します。したがって、これを返す必要があります。

id | zipcode | provider | channel
---------------------------------
1  | 91773   | 342      | 0
2  | 91773   | 2261     | 177
5  | 91773   | 5590     | 135
8  | 91773   | 6010     | 0

かなりの数のクエリを試しましたが、どれもうまくいきませんでした。前もって感謝します。

編集: 与えられた例のいくつかを試しましたが、どれも正しい情報を返していないようです。より良い例はこれらを使用することであり、その理由がわかります:ユニコーンの値に挿入します

(1, 91773, 342, 0),
(2, 91773, 2261, 177),
(3, 91773, 5590, 0),
(4, 91773, 5590, 0),
(5, 91773, 5590, 135),
(6, 91773, 5590, 0),
(7, 91773, 6010, 0),
(8, 91773, 6010, 0),
(9, 91776, 5590, 135),
(10, 91776, 5590, 0),
(11, 91776, 6010, 0),
(12, 91776, 6010, 0);
4

3 に答える 3

3

このようなものはうまくいくはずです...

DELETE unicorns 
FROM   unicorns 
WHERE  id NOT IN (SELECT id 
                  FROM   (SELECT unicorns.provider, 
                                 Max(id) AS id 
                          FROM   unicorns 
                                 LEFT JOIN (SELECT provider, 
                                                   Max(channel) AS channel 
                                            FROM   unicorns 
                                            GROUP  BY provider) p 
                                        ON p.provider = unicorns.provider 
                                           AND p.channel = unicorns.channel 
                          WHERE  p.provider IS NOT NULL 
                          GROUP  BY unicorns.provider) p2) 

デモを見る

于 2013-02-28T20:26:03.797 に答える
3

これは、自己結合を使用して実行できます。削除を行っているだけの場合:

DELETE a
FROM foo a 
  JOIN foo b on (a.zipcode = b.zipcode AND a.provider = b.provider)
WHERE 
  a.channel < b.channel;

削除する前にデータを確認したい場合 (何が残るか):

SELECT * 
FROM foo
WHERE ID NOT IN (
 SELECT a.id
 FROM foo a 
   JOIN foo b on (a.zipcode = b.zipcode AND a.provider = b.provider)
 WHERE 
   a.channel < b.channel);

SQL フィドルのデモ

于 2013-02-28T20:59:34.640 に答える
0

次のようなものを使用できると思います。

delete from unicorns
where id not in (
  SELECT * FROM (
    SELECT MAX(id)
    FROM unicorns
    WHERE (provider, zipcode, channel) IN (
      SELECT provider, zipcode, max(channel) mx_channel
      FROM unicorns
      GROUP BY provider, zipcode
    )
    GROUP BY provider, zipcode) s)

ここでフィドルを参照してください。

于 2013-02-28T21:03:20.100 に答える