Sql 查询谁将只输出字段1中超过特定阈值的数字
我必须对ORACLE DB进行一个“简单”查询,它只输出field1中超过特定阈值的数字 换句话说,假设数据库中有以下数据Sql 查询谁将只输出字段1中超过特定阈值的数字,sql,oracle,Sql,Oracle,我必须对ORACLE DB进行一个“简单”查询,它只输出field1中超过特定阈值的数字 换句话说,假设数据库中有以下数据 FIELD1 FIELD2 ========= ============== 3291234567 333991123456789 3277654321 333011123456789 3481234567 333101123456789 3291234567
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……。”(是表包含许多其他我必须筛选的字段:-)