我必须在 ORACLE DB 上进行一个"简单"查询,该数据库将仅输出字段 1 中超过特定阈值的数字。
换句话说,假设我在数据库中有以下数据。
FIELD1 FIELD2
========= ==============
3291234567 333991123456789
3277654321 333011123456789
3481234567 333101123456789
3291234567 333991123456789
3291234567 333011123456789
3277654321 333015123456789
3277654321 333103123456789
3277654321 333201123456789
3481234567 333112123456789
我只想输出 field1 中出现次数为>= 3 的数字,因此查询输出将为:
FIELD1 FIELD2
========= ==============
3277654321 333011123456789
3277654321 333015123456789
3277654321 333103123456789
3277654321 333201123456789
3291234567 333991123456789
3291234567 333991123456789
3291234567 333011123456789
请帮忙!!!谢谢卢卡斯
这应该适合您(使用 COUNT(*)
作为窗口函数) - 我假设你想要 Oracle,即使问题被标记为 mysql
:
SELECT field1, field2 FROM (
SELECT field1, field2, COUNT(*) OVER ( PARTITION BY field1 ) field1_cnt
FROM mytable
) WHERE field1_cnt >= 3;
在MySQL中完成此操作有点棘手,因为MySQL没有窗口函数。
SELECT * FROM db_table WHERE field1 IN
( SELECT field1 FROM db_table GROUP BY field1 HAVING count(*) >= 3 )
我相信这将适用于Oracle和MySQL。 使用子查询列出具有三次出现的所有 field1 条目,然后运行原始查询以匹配该列表中的 field1 条目。
更新
参考您评论中的其他信息:
由于在这种情况下,子查询是一组用于标识的分组信息,FIELD1
值满足yourtable
中出现 3 次以上的条件,并且由于这些附加信息INNER JOIN
-ed 到 yourtable
,如果您在最顶层的查询中添加带有WHERE
子句的字段过滤,那就足够了。
因此,带有WHERE
子句的查询应如下所示:
SELECT A.FIELD1, A.FIELD2
FROM
yourtable A
INNER JOIN
(
SELECT FIELD1, COUNT (1)
FROM yourtable
GROUP BY FIELD1
HAVING COUNT (1) >= 3
) B
ON A.FIELD1 = B.FIELD1
WHERE
A.FIELD1 = 'some_value'
同样,在您的最后一条评论中,如果您在yourtable
中有更多字段需要过滤,您可以添加它们,例如:
..................
WHERE
A.FIELD1 = 'some_value'
AND A.FIELD5 = 'some_field5_val'
AND (...)