2017-11-04 73 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

相關問題