Sql 查询谁将只输出字段1中超过特定阈值的数字

Sql 查询谁将只输出字段1中超过特定阈值的数字,sql,oracle,Sql,Oracle,我必须对ORACLE DB进行一个“简单”查询,它只输出field1中超过特定阈值的数字 换句话说,假设数据库中有以下数据 FIELD1 FIELD2 ========= ============== 3291234567 333991123456789 3277654321 333011123456789 3481234567 333101123456789 3291234567

我必须对ORACLE DB进行一个“简单”查询,它只输出field1中超过特定阈值的数字

换句话说,假设数据库中有以下数据

FIELD1               FIELD2
=========            ==============
3291234567           333991123456789
3277654321           333011123456789
3481234567           333101123456789
3291234567           333991123456789
3291234567           333011123456789
3277654321           333015123456789
3277654321           333103123456789
3277654321           333201123456789
3481234567           333112123456789
我只想输出字段1中出现次数>=3的数字,因此查询输出为:

FIELD1        FIELD2
=========     ==============
3277654321    333011123456789
3277654321    333015123456789
3277654321    333103123456789
3277654321    333201123456789
3291234567    333991123456789
3291234567    333991123456789
3291234567    333011123456789
请帮忙!!!! 谢谢 Lucas

这应该适合您(使用
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没有窗口函数。

这应该适合您(使用
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没有窗口功能。

UPDATE

参考您评论中的其他信息:

由于在这种情况下,子查询是一组分组信息,用于标识
FIELD1
值满足在
yourtable
中出现3次以上的条件,并且由于此附加信息是
内部连接到
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' 
同样,根据您最后的评论,如果您的表中有更多需要筛选的字段,您可以添加它们,如:

     ..................
     WHERE 
       A.FIELD1 = 'some_value' 
       AND A.FIELD5 = 'some_field5_val'
       AND (...)

更新

参考您评论中的其他信息:

由于在这种情况下,子查询是一组分组信息,用于标识
FIELD1
值满足在
yourtable
中出现3次以上的条件,并且由于此附加信息是
内部连接到
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' 
同样,根据您最后的评论,如果您的表中有更多需要筛选的字段,您可以添加它们,如:

     ..................
     WHERE 
       A.FIELD1 = 'some_value' 
       AND A.FIELD5 = 'some_field5_val'
       AND (...)
我相信这将在Oracle和MySQL中起作用。使用子查询,列出所有出现三次的field1条目,然后运行原始查询以匹配该列表中的field1条目


我相信这将在Oracle和MySQL中起作用。使用子查询,列出所有出现三次的field1条目,然后运行原始查询以匹配该列表中的field1条目。

您的想法与我类似。一些建议:将字段名放入计数是不必要的,实际上会减慢查询速度<代码>计数(*)
计数(1)
是最快的。您从未使用过FCOUNT,那么为什么要声明它或使用选择计数字段呢?是的,您是对的,这可以优化。Thx for suggestion.DAMN T_G:-(您的查询报告我在ORACLE 11G:)在第10行出现B*错误:ORA-00905:缺少关键字请帮助!!!你好我真的很抱歉出现这个问题-查询中不应该有
AS
关键字。我已经更正了我的答案,现在应该可以了。您好,谢谢,现在看来它能用了。我怎样才能添加一些where子句,比如“where field1=xxx和field5=1……。”(是的,表中包含许多我必须过滤的其他字段:-)您和我有类似的想法。一些建议:将字段名放入计数是不必要的,实际上会减慢查询速度<代码>计数(*)
计数(1)
是最快的。您从未使用过FCOUNT,那么为什么要声明它或使用选择计数字段呢?是的,您是对的,这可以优化。Thx for suggestion.DAMN T_G:-(您的查询报告我在ORACLE 11G:)在第10行出现B*错误:ORA-00905:缺少关键字请帮助!!!你好我真的很抱歉出现这个问题-查询中不应该有
AS
关键字。我已经更正了我的答案,现在应该可以了。您好,谢谢,现在看来它能用了。如何添加一些where子句,如“where field1=xxx和field5=1……。”(是表包含许多其他我必须筛选的字段:-)