改进 SQL 查询以删除出现次数超过 N 次的行
Improve SQL query for removing rows that appear more than N times
下面有更好的办法吗?
SELECT *
FROM table
WHERE CONCAT(a, b, c, d) NOT IN
(
SELECT CONCAT(a, b, c, d) AS result
FROM table
GROUP BY result
HAVING COUNT(*) < 40
)
我也尝试过使用一些连接,但是 运行 内存不足。我想做的是,如果 a、b、c、d 重复 40 次或更多次,则忽略该数据,否则 return。最终我将结果吐出到一个 CSV 文件中。
编辑:示例数据
A |B |C |D
---|---|---|---
123|ABC|ccc|ddd
123|ABC|ccc|ddd
... (40 times)
456|qwe|qqq|www
789|qwe|qqq|www
会return:
456|qwe|qqq|www
789|qwe|qqq|www
在您的示例中,您有 NOT IN
(重复 39 次或更少的结果),但您想要 HAVING COUNT(*) >= 40
你可以试试:
SELECT tba.*
FROM table tba
INNER JOIN (SELECT a, b, c, d
FROM table
GROUP BY a, b, c, d
HAVING COUNT(*) < 40
) as tbb ON tbb.a = tba.a AND tbb.b = tba.b AND tbb.c = tba.c AND tbb.d = tba.d
这样您就不需要更改 HAVING。
试试这个:
SELECT *
从 table 作为
inner join (SELECT CONCAT(a,b,c,d) 作为结果,count(*) 作为 c
来自 table
按结果分组)作为 CONCAT(a,b,c,d) = r.result
上的 r
其中 c < 40
下面有更好的办法吗?
SELECT *
FROM table
WHERE CONCAT(a, b, c, d) NOT IN
(
SELECT CONCAT(a, b, c, d) AS result
FROM table
GROUP BY result
HAVING COUNT(*) < 40
)
我也尝试过使用一些连接,但是 运行 内存不足。我想做的是,如果 a、b、c、d 重复 40 次或更多次,则忽略该数据,否则 return。最终我将结果吐出到一个 CSV 文件中。
编辑:示例数据
A |B |C |D
---|---|---|---
123|ABC|ccc|ddd
123|ABC|ccc|ddd
... (40 times)
456|qwe|qqq|www
789|qwe|qqq|www
会return:
456|qwe|qqq|www
789|qwe|qqq|www
在您的示例中,您有 NOT IN
(重复 39 次或更少的结果),但您想要 HAVING COUNT(*) >= 40
你可以试试:
SELECT tba.*
FROM table tba
INNER JOIN (SELECT a, b, c, d
FROM table
GROUP BY a, b, c, d
HAVING COUNT(*) < 40
) as tbb ON tbb.a = tba.a AND tbb.b = tba.b AND tbb.c = tba.c AND tbb.d = tba.d
这样您就不需要更改 HAVING。
试试这个:
SELECT *
从 table 作为
inner join (SELECT CONCAT(a,b,c,d) 作为结果,count(*) 作为 c
来自 table
按结果分组)作为 CONCAT(a,b,c,d) = r.result
上的 r
其中 c < 40