2017-11-04 46 views
2

我有一个包含两个字段(代码(char)和价格(十进制))的表格(价格)。我需要找到具有相同代码的所有记录,价格低于或低于两个最高价格5倍。删除所有低于第二高值5倍的值的记录

E.G.在这种情况下,我想删除ID = 1:

id code price 
1 1001 10 
2 1001 101 
3 1001 40 
4 1001 201 
5 1002 122 
6 1002 50 
+0

@ lad2025,运说,价格必须比其他2种更低的价格的5倍。 40 * 5不是<200和40 * 5不是<101 – Serge

+0

@系列2最高值或两个值的AVG? – lad2025

+1

将200更改为201.两个值的最高值或AVG?最高的值。如果我们有10,20,200我们不需要删除10. –

回答

2
DELETE 
FROM myTable 
WHERE ID IN (
    SELECT * 
    FROM (
     SELECT t2.id 
     FROM myTable t2 
     WHERE EXISTS (
      SELECT 1 
      FROM myTable t3 
      WHERE t3.code = t2.code 
      AND t3.price > t2.price * 5 
      HAVING COUNT(*) > 1 
      ) 
    ) t 
) 
; 
+0

请COUNT(*)之间'除去空间'避免语法错误和这个查询改为'DELETE'所以它符合提问者的要求:) – lad2025

+0

'DELETE T1 FROM mytable的T1 WHERE EXISTS( 选择1 FROM mytable的T2 WHERE t2.code = t1.code AND t2.price> t1.price * 5 HAVING COUNT(*)> 1 )' 它不起作用:**'您无法指定目标表't1'在FROM子句中更新** ** – lad2025

+0

可能应该使用连接删除吗? –

1

我的方法:

DELETE t 
FROM t 
JOIN (SELECT code, 
     REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(
     GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'), ';', 2)), ';',1)) 
     AS second_price 
    FROM t 
    GROUP BY code) s 
    ON t.code = s.code 
AND t.price * 5 < s.second_price; 

Rextester Demo

它是基于选择第二个价格:

SELECT code, 
    REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(
    GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'), ';', 2)), ';',1)) 
    AS second_price 
FROM t 
GROUP BY code; 

Rextester Demo2


编辑:

实际上它可能是更容易:

DELETE t 
FROM t 
JOIN (SELECT code, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(
       GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'), 
        ';', 2), ';',-1) AS second_price 
    FROM t 
    GROUP BY code) s 
    ON t.code = s.code 
AND t.price * 5 < s.second_price; 

Rextester Demo

好的和快速的解决方案,但老实说,我不能清楚地理解它。

这是很容易做到:

SELECT code, 
    GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'), 
    SUBSTRING_INDEX(GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'), ';', 2), 
    SUBSTRING_INDEX(SUBSTRING_INDEX(
       GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'), 
        ';', 2), ';',-1) 
FROM t 
GROUP BY code; 

enter image description here

+0

好的和快速的解决方案,但老实说,我不能清楚地理解它。 –

+0

@СергейСоколов请检查我的edit.It是很容易遵循我的代码:) – lad2025