我有一个包含两个字段(代码(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. –