我有一個包含兩個字段(代碼(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
我有一個包含兩個字段(代碼(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
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
)
;
我的方法:
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;
它是基於選擇第二個價格:
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;
編輯:
實際上它可能是更容易:
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;
好的和快速的解決方案,但老實說,我不能清楚地理解它。
這是很容易做到:
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;
好的和快速的解決方案,但老實說,我不能清楚地理解它。 –
@СергейСоколов請檢查我的edit.It是很容易遵循我的代碼:) – lad2025
@ lad2025,運說,價格必須比其他2種更低的價格的5倍。 40 * 5不是<200和40 * 5不是<101 – Serge
@系列2最高值或兩個值的AVG? – lad2025
將200更改爲201.兩個值的最高值或AVG?最高的值。如果我們有10,20,200我們不需要刪除10. –