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

我只想保留一条记录,如果频道除了 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 Fiddle 演示

于 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 回答